首页 > 解决方案 > 如何在另一个 RecyclerView 的项目中实现 RecyclerView

问题描述

我应该实现 a RecyclerView,它的项目包含 aTextView和另一个内部水平RecyclerView

我开始考虑到内心RecyclerView喜欢任何其他人View。当我尝试将上下文传递给LinearLayoutManager()和 时,问题发生了RecyclerView.setAdapter()

问题是:我无法传递上下文,因为我试图在第一个RecyclerView适配器内传递它

我无法传递上下文,也不知道这种方式是否是最佳方式,或者最终是否可行。

这是我的代码:


public class TheFirstAdapter extends RecyclerView.Adapter<TheFirstAdapter.TheFirstViewHolder> {

    private Context context;
    private List<FirstItemModel> firstItemModelList;
    private List<SecondItemModel> secondItemModelList;
    SecondItemModel secondItemModel;
    TheSecondAdapter theSecondAdapter;

    public TheFirstAdapter(Context context, List<FirstItemModel> firstItemModel) {
        this.context = context;
        this.firstItemModelList = firstItemModelList;
    }

    @NonNull
    @Override
    public TheFirstViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.add_routine_list_item, parent,
                false);
        return new TheFirstAdapter.TheFirstViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull TheFirstViewHolder holder, int position) {

//there is an error in this line:
////java.lang.NullPointerException: Attempt to invoke interface method 'boolean java.util.List.add(java.lang.Object)' on a null object reference

//////the solution: secondItemModelList= new ArrayList<>(); 
            for (int i = 1; i < 5; i++) {
            secondItemModel = new AddRoutineRoutines("Morning", "#9697D6");
            secondItemModelList.add(secondItemModel);
        }

        FirstItemModel firstItemModel = firstItemModelList.get(position);
        holder.textView.setText(addRoutineItemModel.getFirstItemText());
        holder.theSecondRecyclerView.setLayoutManager(new LinearLayoutManager(context));
        TheSecondAdapter theSecondAdapter = new TheSecondAdapter(context, secondItemModelList);
        holder.theSecondRecyclerView.setAdapter();
    }

    @Override
    public int getItemCount() {
        if (firstItemModelList == null) return 0;
        return firstItemModelList.size();
    }

    class TheFirstViewHolder extends RecyclerView.ViewHolder {

        TextView textView;
        RecyclerView theSecondRecyclerView;

        public TheFirstViewHolder(@NonNull View itemView) {

            super(itemView);
            textView = itemView.findViewById(R.id.first_item_text);
            theSecondRecyclerView = itemView.findViewById(R.id.the_second_recycler_view);
        }
    }
}

Edit1: 我通过了上下文,但仍然存在上面显示的问题。

Edit2: 问题是我没有初始化secondItemModelList.

*经过讨论,此代码有效:*


public class TheFirstAdapter extends RecyclerView.Adapter<TheFirstAdapter.TheFirstViewHolder> {

    private Context context;
    private List<FirstItemModel> firstItemModelList;
    private List<SecondItemModel> secondItemModelList;
    SecondItemModel secondItemModel;

    public TheFirstAdapter(Context context, List<FirstItemModel> firstItemModel) {
        this.context = context;
        this.firstItemModelList = firstItemModelList;
    }

    @NonNull
    @Override
    public TheFirstViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.add_routine_list_item, parent,
                false);
        return new TheFirstAdapter.TheFirstViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull TheFirstViewHolder holder, int position) {

        FirstItemModel firstItemModel = firstItemModelList.get(position);
        holder.textView.setText(addRoutineItemModel.getFirstItemText());
        holder.updateView(secondItemModelList);
    }

    @Override
    public int getItemCount() {
        if (firstItemModelList == null) return 0;
        return firstItemModelList.size();
    }

    class TheFirstViewHolder extends RecyclerView.ViewHolder {

        TextView textView;
        RecyclerView theSecondRecyclerView;

        public TheFirstViewHolder(@NonNull View itemView) {

            super(itemView);
            textView = itemView.findViewById(R.id.first_item_text);
            theSecondRecyclerView = itemView.findViewById(R.id.the_second_recycler_view);
        }

        public updateView(List<SecondItemModel> secondItemModelList) {
            secondItemModelList = new ArrayList<>();

            for (int i = 1; i < 5; i++) {
                secondItemModel = new SecondItemModel("Morning", "#9697D6");
                secondItemModelList.add(secondItemModel);
            }

            TheSecondAdapter theSecondAdapter = new TheSecondAdapter(context, secondItemModelList);
            LinearLayoutManager layoutManager
                    = new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false);
            theSecondRecyclerView.setLayoutManager(layoutManager);
            theSecondRecyclerView.setAdapter(theSecondAdapter);
        }
    }
}

标签: androidandroid-recyclerview

解决方案


您发送给构造函数 arg 的上下文是什么LinearLayoutManager?如果我理解你的问题。您正在使用来自父母的上下文。请使用itemView.context.

更新:

你的代码很糟糕。

  1. 不要在bindView方法中创建适配器。
  2. 不要在bindView方法中设置/删除数据。
  3. BindView仅用于绑定数据以供查看。只有这样。

ViewHolder 应该是这样的:

class TheFirstViewHolder extends RecyclerView.ViewHolder {

        TextView textView;
        RecyclerView theSecondRecyclerView;
        TheFirstAdapter adapter;

        public TheFirstViewHolder(@NonNull View itemView) {

            super(itemView);
            textView = itemView.findViewById(R.id.first_item_text);
            theSecondRecyclerView = itemView.findViewById(R.id.the_second_recycler_view);
        }

        public void updateView(....) {
           //create new adapter if need.
           //set data for adapter if need
           ...
        }
    }

onBindViewHolder应该是这样的:holder.updateView(...)


推荐阅读