滚动后循环器视图项目颜色更改重复

时间:2017-10-25 11:21:27

标签: android android-recyclerview recycler-adapter

滚动后重复使用Recycler视图项颜色更改。

我曾经在Recyclerview列表的特定位置改变颜色。当滚动发生时,底部的另一个项目具有相同的变化。它在模式中重复。如何解决这个问题?

 holder.recycle_Listing.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            itemListener.connectionClicked(v,position, itemtype);

            holder.mainlayout.setBackgroundColor(Color.parseColor("#e927a4d1"));

        }
    });

6 个答案:

答案 0 :(得分:4)

回收者视图在OnBindViewHolder.So中回收视图。当点击项目时,它会反映在其他一些位置。要解决这个问题。创建一个全局SparseBooleanArray来存储点击的位置。

private final SparseBooleanArray array=new SparseBooleanArray();

然后在最终视图中添加clickListener并onClick存储所点击项目的位置。

public class ViewHolder extends RecyclerView.ViewHolder {
    public YOURVIEW view;
    public ViewHolder(View v) {
        super(v);
        view = (YOURVIEW) v.findViewById(R.id.YOURVIEWID);
        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                array.put(getAdapterPosition(),true);
                notifyDataSetChanged();
            }
        });
    }
}

在OnBindViewHolder内部,

@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
    if(array.get(position)){
        holder.mainlayout.setBackgroundColor(Color.parseColor("#e927a4d1"));
    }else{
        holder.mainlayout.setBackgroundColor(UNSELECTEDCOLOR);
    }
}

答案 1 :(得分:1)

我认为您可以在void onBindViewHolder(VH holder, int position);中设置背景颜色,例如

List<Integer> selectedPosition = new ArrayList(yourDataSize);
void onBindViewHolder(VH holder, int position){

     if(selectedPosition.get(position) == 1){
       holder.mainlayout.setBackgroundColor(Color.parseColor("#e927a4d1"));
     }else {
       holder.mainlayout.setBackgroundColor(normalColor);
     }

     //when the item clicked 
     selectedPosition.add(position,1);

}

答案 2 :(得分:0)

该函数返回相对位置而不是绝对位置,因此当屏幕滚动时,位置将替换为新值。使用列表中的位置获得所需结果。

答案 3 :(得分:0)

这是由于回收者视图的观察者的回收。试试这个 它对我有用。

public ListViewHolder(View itemView) {
        super(itemView);

        this.setIsRecyclable(false);


    }

答案 4 :(得分:0)

尝试在适配器类中实现此方法,可能是它解决了您的问题

@Override
    public void onViewRecycled(ViewHolderProduct holder) {
        super.onViewRecycled(holder);
        holder.mainlayout.removeAllViews();
} 

答案 5 :(得分:0)

刚刚保存了数组中的每个项目键,并且所选数组也通过我的Adapter类传递。即使是简单的颜色变化也能以这种格式正常工这里的代码根据我的要求进行了更改。

@Override
    public void onBindViewHolder(final ICConversationHomeAddConnectionsAdapter.ViewHolder holder, final int position) {

        JsonObject object = dataArray.get(position).getAsJsonObject();
        if(selectedArray.contains(object.get("userkey").getAsString()))
        {
            GradientDrawable borCol = new GradientDrawable();
            borCol.setCornerRadius(7);
            borCol.setColor(Color.parseColor("#ffffff"));
            borCol.setStroke(2, Color.parseColor("#60B9E1"));
            holder.recycle_Listing.setBackgroundDrawable(borCol);
           //holder.mainlayout.setBackgroundColor(Color.parseColor("#e927a4d1"));
        }
        else
        {
            GradientDrawable borCol = new GradientDrawable();
            borCol.setCornerRadius(7);
            borCol.setColor(Color.parseColor("#ffffff"));
            borCol.setStroke(1, Color.parseColor("#e0e0e0"));
            holder.recycle_Listing.setBackgroundDrawable(borCol);
          //holder.mainlayout.setBackgroundColor(Color.parseColor("#f1f1f1"));
        }


            holder.profileName.setText(object.get("name").getAsString());

        holder.recycle_Listing.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


                holder.mainlayout.setSelected(!holder.mainlayout.isSelected());

                if (holder.mainlayout.isSelected()) {
                    GradientDrawable borCol = new GradientDrawable();
                    borCol.setCornerRadius(7);
                    borCol.setColor(Color.parseColor("#ffffff"));
                    borCol.setStroke(2, Color.parseColor("#60B9E1"));
                    holder.recycle_Listing.setBackgroundDrawable(borCol);
                  //  holder.mainlayout.setBackgroundColor(Color.parseColor("#11B5DA"));
                } else {
                    GradientDrawable borCol = new GradientDrawable();
                    borCol.setCornerRadius(7);
                    borCol.setColor(Color.parseColor("#ffffff"));
                    borCol.setStroke(1, Color.parseColor("#e0e0e0"));
                    holder.recycle_Listing.setBackgroundDrawable(borCol);
                   // holder.mainlayout.setBackgroundColor(Color.parseColor("#f1f1f1"));
                }



                itemListener.connectionClicked(v,position, itemtype);


               //holder.mainlayout.setBackgroundColor(Color.parseColor("#11B5DA"));
              //holder.mainlayout.setBackgroundColor(Color.parseColor("#f1f1f1"));
            }
        });



    }

此代码工作正常,回收器中没有重复的颜色变化。如果有任何疑问可以随意通过评论或聊天