android - 如何在另一个 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);
}
}
}
解决方案
您发送给构造函数 arg 的上下文是什么LinearLayoutManager
?如果我理解你的问题。您正在使用来自父母的上下文。请使用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(...)
推荐阅读
- python - 如果所有值都为 False,则为 True,如果至少有一个 True 值,则为 False python
- apache-kafka - fetch.max.message.bytes 和 max.message.bytes Kafka 配置
- reactjs - 无法使用 FlatList 上的简单映射对未安装的组件执行 React 状态更新
- html - Ruby on rails send_data/send_file 在点击多条记录时仅下载最新文件
- c++ - Dijkstra 算法需要什么样的图表?C++
- javascript - 如何在值之间用逗号推送数组
- c - 带有 argp.h 的帮助消息中的文本间距错误
- php - 如何过滤属于特定类别的帖子 [产品]
- google-chrome - 从扩展打开背景选项卡
- python - 使用 Tweepy 时如何删除 Twitter 帖子的链接?