我是Recyclerviews的新手,我正尝试从OnBindViewHolder外部的函数修改viewHolder(我将更改viewHolder的背景颜色)。
我尝试过: -将ViewHolders保存在ViewHolders的数组列表中并进行更改。 -直接从回收者视图中获取视图。 -直接通过ID获取视图持有者并进行修改。 还有很多.. 我尝试的所有操作都失败了,由于某种原因,我发现某些视图有效,并且成功更改了它们的颜色,但是随后出现错误,告诉我某些视图为空。 我试图从onBindViewHolder添加我的视图,但是当我滚动时,似乎多次调用了我的视图。 我最新的解决方案是将onViewViewHolder方法中的视图添加到列表中。 似乎由于某种原因,当recyclerview完全滚动时,ViewHolders会被保存,我不知道发生了什么..请帮助。 这是OncreateViewHolder方法的代码:
@Override 公共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;
}
答案 0 :(得分:0)
请勿在onBindViewHolder之外访问或修改Viewholder的视图。相反,您可以将关联数据与视图一起使用。
考虑一下您的适配器类具有HashMap colorMap的全局变量类型。 HashMap的键将是索引,值将是color。
例如,您要将第二行的颜色更改为红色。
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时,将撤回视图修改策略。