ViewHolders仅在我滚动时考虑到

时间:2019-04-16 16:33:38

标签: android android-recyclerview

我是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;
}

1 个答案:

答案 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时,将撤回视图修改策略。