首页 > 解决方案 > 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;
}

标签: androidandroid-recyclerview

解决方案


不要在 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 回调时被收回。


推荐阅读