首页 > 解决方案 > Android 遍历所有 RecyclerView 项目

问题描述

我的应用程序中有一个 RecyclerView,我正在显示的列表项是CardView 内的一个 TextView,当我单击任何显示的 TextView 时,它将是我稍后将使用的选定项。
想法是,如果我点击其中任何一个,持有它的 CardView 应该更改 bgcolor,例如颜色重音。

问题是,一旦我更改了cardview 的bgcolor 之一,那么当我从RecyclerView 单击任何其他TextView 时,我不知道该怎么做。
我正在使用的代码:

@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.setOnClickListener ...)时,它应该遍历每个 RecyclerView 项目,并将它们的 bgcolor 重置为原色

标签: androidandroid-recyclerview

解决方案


当您更新 a 中的项目时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);
                }
            });       
        }
    }

}

推荐阅读