Android go trough all RecyclerView items



我在我的应用中有一个recyclerview,我显示的列表项很简单a textView cardView ,当我单击任何显示的文本视图时,这将是我稍后将与之合作的选择的项目。
想法是,如果我单击其中的任何一个,则包含它的卡视图应该更改bgcolor,例如颜色口音。

问题是,一旦我更改了CardView的bgcolor,那么当我单击RecyClerview的任何其他文本视图时,我就不知道该如何做。
我正在使用的代码:

@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
    holder.name.setText(mNames.get(position));
    int favIndex = copyDatas.get(position).fieldNames.indexOf("fav");
    boolean fav = (boolean) copyDatas.get(position).values.get(favIndex);
    if (fav) {
        holder.fav.setVisibility(View.VISIBLE);
        holder.notfav.setVisibility(View.GONE);
    } else {
        holder.notfav.setVisibility(View.VISIBLE);
        holder.fav.setVisibility(View.GONE);
    }
    holder.name.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(mContext, "Choosen: " + mNames.get(position), Toast.LENGTH_SHORT).show();
            String entity_name = mNames.get(position);                
            holder.cardView.setCardBackgroundColor(mContext.getColor(R.color.colorAccent));
        }
    });       
}

我想做的基本上是:当我单击它们时(holder.name.name.setonclicklistener ...(,它应该遍历每个循环系统项目,然后将其bgcolor重置为主颜色

您需要记住选择哪个位置。然后,您可以有条件地改变OnBindViewHolder

中的背景
int selectedPosition = 0;
    @Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
    holder.name.setText(mNames.get(position));
    int favIndex = copyDatas.get(position).fieldNames.indexOf("fav");
    boolean fav = (boolean) copyDatas.get(position).values.get(favIndex);
    if (fav) {
        holder.fav.setVisibility(View.VISIBLE);
        holder.notfav.setVisibility(View.GONE);
    } else {
        holder.notfav.setVisibility(View.VISIBLE);
        holder.fav.setVisibility(View.GONE);
    }
   if (position == selectedPosition){
     holder.cardView.setCardBackgroundColor(mContext.getColor(R.color.colorAccent));
   }
   else{
       holder.cardView.setCardBackgroundColor(mContext.getColor(R.color.otherColor));
   }
    holder.name.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(mContext, "Choosen: " + mNames.get(position), Toast.LENGTH_SHORT).show();
            String entity_name = mNames.get(position);                
            selectedPosition = position;
            getadapter().notifydatasetchanged();
        }
    });       
    }

在更新RecyclerAdapter中的项目时,应使用适配器的notify方法之一。在您的情况下,您正在跟踪所选项目,当用户选择新项目时,您只需要更新先前选择的项目即可。

如果您的ViewHolder在您的适配器中,则可以创建一个方法和变量,可以轻松处理此操作。

public class MyAdapter {
    // keeping track of the currently selected item
    private int selected = -1;
    public void updateSelectedItem(int position) {
        int previous = selected;
        selected = position;
        // tell the adapter to re-render the two positions to redraw their backgrounds
        notifyItemChanged(previous);
        notifyItemChanged(selected);
    }

    public class MyViewHolder {
        @Override
        public void onBindViewHolder(final ViewHolder holder, final int position) {
            if(selected == position) {
                // show a selected background
            } else {
                // show the normal background
            }
            holder.name.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // notify the adapter the selected item has changed.
                    updateSelectedItem(position);
                }
            });       
        }
    }
}

最新更新