[英]How can i create a RecyclerView inside of the another recyclerview's item?
[英]How can I implement a RecyclerView inside another RecyclerView's item
我应该实现一个RecyclerView
,它的项目包含一个TextView
和另一个内部水平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);
}
}
}
您发送给构造函数LinearLayoutManager
arg的上下文是什么? 如果我了解您的问题。 您正在使用父级的上下文。 请使用itemView.context
。
更新:
您的代码非常糟糕。
bindView
方法中创建适配器。 bindView
方法中设置/删除数据。 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(...)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.