【问题标题】:How to show a RecyclerView (with data fetched from API) as a list item in another RecyclerView in android?如何在 android 的另一个 RecyclerView 中将 RecyclerView(从 API 获取的数据)显示为列表项?
【发布时间】:2020-10-13 05:31:22
【问题描述】:

想要实现:当用户输入“天气”一词时,聊天机器人将天气预报作为该聊天项目(位于外部 RecyclerView 中)内的 RecyclerView 返回。

我希望天气信息成为实际的聊天项目。

我有 MessageAdapter 和 WeatherAdapter 分别处理消息和天气预报信息,我很难处理 MessageAdapter 的 onBindViewHolder 中的“返回天气预报”情况。

我尝试了许多不同的方法都无济于事: making a ConcatAdapter, making a custom adapter, 制作一个片段,从我进行天气获取的主要活动接收天气数据和showing that fragment in adapter...

java.lang.NullPointerException:尝试调用虚拟方法 'java.io.Serializable android.os.Bundle.getSerializable(java.lang.String)' 在空对象上 参考 在 com.demo.chatbot.WeatherFragment.onCreateView(WeatherFragment.java:25)

weatherList = (ArrayList<Weather>) getArguments().getSerializable("weather"); (WeatherFragment.java:25)

数据获取尚未开始,然后片段正在尝试加载数据...

主要问题是我必须在获取 API 后设置weatherAdapter.setWeatherList(weatherList.getWeeklyWeather());,这必须在我的主要活动中完成,并且当布局应该在 MessageAdapter 中完成时,必须在主要活动中初始化 RecyclerViews。

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

我不明白为什么这么复杂。在 react native 中,只需使用 .map 或 for 循环即可。我错过了什么明显的东西吗?

【问题讨论】:

  • 如果您的列表有数据,则将列表实例传递给另一个 RecyclerView 并在另一个 RecyclerView 的适配器实例上调用 notifyDataSetChanged

标签: java android android-recyclerview android-adapter


【解决方案1】:

重点是让天气预报成为一条消息。使用两个 for 循环(一个在 WeatherViewHolder 中,一个在 onBindViewHolder 中)和 TextView 数组in适配器来处理天气布局。这是我的适配器代码:

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);
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-15
    • 2019-02-22
    • 2016-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多