Java 如何在android中的另一个RecyclerView中将RecyclerView(带有从API获取的数据)显示为列表项?
想要实现:一个聊天机器人,当用户输入单词“weather”时,它将天气预报作为聊天项目(位于外部RecyclerView中)内的RecyclerView返回 我希望天气信息是实际的聊天项目 我有MessageAdapter和WeatherAdapter,它们分别处理消息和天气预报信息,我很难处理MessageAdapter的onBindViewHolder中的“返回天气预报”案例Java 如何在android中的另一个RecyclerView中将RecyclerView(带有从API获取的数据)显示为列表项?,java,android,android-recyclerview,android-adapter,Java,Android,Android Recyclerview,Android Adapter,想要实现:一个聊天机器人,当用户输入单词“weather”时,它将天气预报作为聊天项目(位于外部RecyclerView中)内的RecyclerView返回 我希望天气信息是实际的聊天项目 我有MessageAdapter和WeatherAdapter,它们分别处理消息和天气预报信息,我很难处理MessageAdapter的onBindViewHolder中的“返回天气预报”案例 rvWeather = findViewById(R.id.rvWeather); // rvWeather is
rvWeather = findViewById(R.id.rvWeather);
// rvWeather is supposed to be inside my item_chat_bot.xml
// but I have to add it to main activity for it to show
rvWeather.setAdapter(weatherAdapter);
// otherwise get No adapter attached; skipping layout
我尝试了许多不同的方法,但都没有成功:
,
,
制作一个片段,接收来自主要活动的天气数据,我在那里做天气采集和
java.lang.NullPointerException:尝试调用虚拟方法
'java.io.Serializable
空对象上的android.os.Bundle.getSerializable(java.lang.String)“”
参考
位于com.demo.chatbot.WeatherFragment.onCreateView(WeatherFragment.java:25)
我不明白为什么这么复杂。在react native中,只需使用.map或for循环即可。我是不是遗漏了一些明显的东西?
关键是要让天气预报成为一条信息。使用两个for循环(一个在WeatherViewHolder中,一个在onBindViewHolder中)和适配器中的TextView数组处理天气布局。以下是我的适配器代码:
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
Message message = messageArrayList.get(position);
switch (message.getType()) {
case "weather":
((WeatherViewHolder) holder).message.setText(message.getMessage());
for (int i = 0; i < weatherList.size(); i++) {
Weather weather = weatherList.get(i);
Glide
.with(context)
.load(context.getResources().getIdentifier(
"icon_" + weather.getWeatherDetails().get(0).getIcon(),
"drawable", context.getPackageName()))
.into(((WeatherViewHolder) holder).mWeatherIcon[i]);
Calendar calendar = new GregorianCalendar();
calendar.setTime(new java.util.Date((long) weather.getDate() * 1000));
((WeatherViewHolder) holder).mDate[i].setText(weekdays[calendar.get(Calendar.DAY_OF_WEEK) % 7]);
((WeatherViewHolder) holder).mMaxTemp[i].setText((int) weather.getTemp().getMax() + "°C");
((WeatherViewHolder) holder).mMinTemp[i].setText((int) weather.getTemp().getMin() + "°C");
((WeatherViewHolder) holder).mWeatherCondition[i].setText(String.valueOf(weather.getWeatherDetails().get(0).getShortDescription()));
}
break;
}
}
public class WeatherViewHolder extends RecyclerView.ViewHolder{
private LinearLayout weatherLayout;
private TextView[] mDate = new TextView[weatherList.size()];
private TextView[] mMaxTemp = new TextView[weatherList.size()];
private TextView[] mMinTemp = new TextView[weatherList.size()];
private TextView[] mWeatherCondition = new TextView[weatherList.size()];
private ImageView[] mWeatherIcon = new ImageView[weatherList.size()];
TextView message;
public WeatherViewHolder(View itemView) {
super(itemView);
message = itemView.findViewById(R.id.message);
weatherLayout = itemView.findViewById(R.id.chat_bot_linear_layout);
for (int i = 0; i < weatherList.size(); i++) {
View view = View.inflate(context, R.layout.item_weather, null);
mWeatherIcon[i] = view.findViewById(R.id.imageViewWeatherIcon);
mDate[i] = view.findViewById(R.id.textViewDate);
mMaxTemp[i] = view.findViewById(R.id.textViewMaxTemp);
mMinTemp[i] = view.findViewById(R.id.textViewMinTemp);
mWeatherCondition[i] = view.findViewById(R.id.textViewWeatherCondition);
weatherLayout.addView(view);
}
}
}
public void onBindViewHolder(final RecyclerView.ViewHolder,int位置){
Message Message=messageArrayList.get(位置);
开关(message.getType()){
“天气”一案:
((WeatherViewHolder)holder.message.setText(message.getMessage());
对于(int i=0;i
如果列表中有数据,则将列表实例传递给另一个RecyclerView,并在另一个RecyclerView的适配器实例上调用notifyDataSetChanged
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
Message message = messageArrayList.get(position);
switch (message.getType()) {
case "weather":
((WeatherViewHolder) holder).message.setText(message.getMessage());
for (int i = 0; i < weatherList.size(); i++) {
Weather weather = weatherList.get(i);
Glide
.with(context)
.load(context.getResources().getIdentifier(
"icon_" + weather.getWeatherDetails().get(0).getIcon(),
"drawable", context.getPackageName()))
.into(((WeatherViewHolder) holder).mWeatherIcon[i]);
Calendar calendar = new GregorianCalendar();
calendar.setTime(new java.util.Date((long) weather.getDate() * 1000));
((WeatherViewHolder) holder).mDate[i].setText(weekdays[calendar.get(Calendar.DAY_OF_WEEK) % 7]);
((WeatherViewHolder) holder).mMaxTemp[i].setText((int) weather.getTemp().getMax() + "°C");
((WeatherViewHolder) holder).mMinTemp[i].setText((int) weather.getTemp().getMin() + "°C");
((WeatherViewHolder) holder).mWeatherCondition[i].setText(String.valueOf(weather.getWeatherDetails().get(0).getShortDescription()));
}
break;
}
}
public class WeatherViewHolder extends RecyclerView.ViewHolder{
private LinearLayout weatherLayout;
private TextView[] mDate = new TextView[weatherList.size()];
private TextView[] mMaxTemp = new TextView[weatherList.size()];
private TextView[] mMinTemp = new TextView[weatherList.size()];
private TextView[] mWeatherCondition = new TextView[weatherList.size()];
private ImageView[] mWeatherIcon = new ImageView[weatherList.size()];
TextView message;
public WeatherViewHolder(View itemView) {
super(itemView);
message = itemView.findViewById(R.id.message);
weatherLayout = itemView.findViewById(R.id.chat_bot_linear_layout);
for (int i = 0; i < weatherList.size(); i++) {
View view = View.inflate(context, R.layout.item_weather, null);
mWeatherIcon[i] = view.findViewById(R.id.imageViewWeatherIcon);
mDate[i] = view.findViewById(R.id.textViewDate);
mMaxTemp[i] = view.findViewById(R.id.textViewMaxTemp);
mMinTemp[i] = view.findViewById(R.id.textViewMinTemp);
mWeatherCondition[i] = view.findViewById(R.id.textViewWeatherCondition);
weatherLayout.addView(view);
}
}
}