android - ViewHolders 仅在我滚动时考虑
问题描述
我是 Recyclerviews 的新手,我正在尝试从 OnBindViewHolder 之外的函数修改 viewHolder(我将更改 viewHolder 的背景颜色)。
我试过: - 将 ViewHolders 保存在 ViewHolders 的 Arraylist 中并更改它们。- 直接从回收站视图中获取视图。- 直接通过id获取view holder并修改。还有更多..我尝试的一切都失败了,我发现由于某种原因有些视图有效,我成功地改变了它们的颜色,但是我收到一个错误,告诉我有些视图是空的。我试图从 onBindViewHolder 添加我的视图,但是当我滚动时,我的视图似乎被多次调用。我最新的解决方案是将视图从 onCreateViewHolder 方法添加到列表中。似乎由于某种原因,当 recyclerview 完全滚动时 ViewHolders 会被保存,我不知道发生了什么......请帮忙。这是 OncreateViewHolder 方法的代码:
@Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view ;
switch (viewType) {
case item_nature.IF_TYPE:
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.if_layout, parent, false);
IFViewHolder v = new IFViewHolder(view);
Holders.add(v);
return v;
case item_nature.ELSE_TYPE:
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.else_layout, parent, false);
ELSEViewHolder v1 = new ELSEViewHolder(view);
Holders.add(v1);
return v1;
case item_nature.THEN_TYPE:
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.then_layout, parent, false);
THENViewHolder v2 = new THENViewHolder(view);
Holders.add(v2);
return v2;
case item_nature.END_TYPE:
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.end_layout, parent, false);
ENDIFViewHolder v3 = new ENDIFViewHolder(view);
Holders.add(v3);
return v3;
case item_nature.CALENDAR:
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.calendar_layout, parent, false);
CALENDARViewHolder v4 = new CALENDARViewHolder(view);
Holders.add(v4);
return v4;
case item_nature.LOCATION:
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.location_layout, parent, false);
LOCATIONViewHolder v5 = new LOCATIONViewHolder(view);
Holders.add(v5);
return v5;
}
return null;
}
解决方案
不要在 onBindViewHolder 之外访问或修改 Viewholder 的视图。相反,您可以将关联数据与视图一起使用。
想想你的适配器类有 HashMap colorMap 的全局变量类型。HashMap 的键是索引,值是颜色。
例如,您想将第二行颜色更改为红色。
colorMap.put(2, Color.RED);
adapter.notifyItemChanged(2); // it can be notifyDataSetChanged(); for the other view need to be change.
最后你的 notifyItemChanged 或 notifyDataSetChanged 方法调用重新绑定视图的原因。
@Override
public void onBindViewHolder(@NonNull ABCHolder abcHolder, int i) {
if(colorMap.containsKey(abcHolder.getAdapterPosition())
abcHolder.itemView.setBackgroundColor(a.get(abcHolder.getAdapterPosition()));
与这种方法不同,您的视图修改策略在 onBindViewHolder 回调时被收回。
推荐阅读
- django - 在服务器上添加 django.contrib.sites 后,Django 管理员行为不端
- excel-formula - 在列范围内定位特定值并将相邻匹配行转置到列中
- azure - 将 Azure Powershell 命令转换为 Azure CLI
- javascript - 如何在反应中调整渲染组件的大小
- python - 如何在迁移学习 vgg16 模型中获得准确率、召回率、f1 分数?
- flutter - 如何使用字段文本使 AppBar 完全四舍五入
- airflow - 计划每分钟运行一次的 Airflow DAG 有时不运行
- c++ - 我解决了一个问题,不知道背后的原因
- python - 无法创建 png 文件以使用 Graphviz(Python)绘制决策树
- chef-infra - 通过来自 cloudformation YAML 脚本的参数以及一些要在属性中覆盖的值传递厨师运行列表