Android 如何在RecyclerView中更改分配给ImageButton的向量的颜色?

Android 如何在RecyclerView中更改分配给ImageButton的向量的颜色?,android,onclicklistener,android-recyclerview,Android,Onclicklistener,Android Recyclerview,我有一个recyclerview,其中显示了几个(8)卡片视图。在每个cardview中,都有一些元素,如文本、imagebutton等。在适配器类(RvAdapter扩展了RecyclerView.Adapter)中,我有一个如下代码。我要做的是使用同一按钮的OnClickListener更改分配给imagebutton的向量(.xml)的颜色 public RvAdapter(Context context,List<Person> persons) { this.mCo

我有一个recyclerview,其中显示了几个(8)卡片视图。在每个cardview中,都有一些元素,如文本、imagebutton等。在适配器类(RvAdapter扩展了RecyclerView.Adapter)中,我有一个如下代码。我要做的是使用同一按钮的OnClickListener更改分配给imagebutton的向量(.xml)的颜色

public RvAdapter(Context context,List<Person> persons) {
    this.mContext=context;
    this.persons=persons;
}

 @Override
 public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
    View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.card_view_content,parent,false);
    ViewHolder vh=new ViewHolder(v);
    return vh;
}

@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
    final ViewHolder mHolder=holder;
    mHolder.personName.setText(persons.get(position).name);
    mHolder.personAge.setText(( persons.get(position).age));

    mHolder.cvCard.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Toast.makeText(mContext,"card number:"+String.valueOf(position),Toast.LENGTH_SHORT).show();
        }
    });

    //this is where the error comes
    mHolder.alarmImageButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //this code line doesnt work
            //mHolder.alarmImageButton.setColorFilter(R.color.colorAccent);

           //this code line works... but it changes the imagebutton color of another card view at below of the recycler view 
           mHolder.alarmImageButton.setColorFilter(Color.argb(255,255,255,255)); 
           Toast.makeText(mContext,"button:"+String.valueOf(position),Toast.LENGTH_SHORT).show();
        }
    });
}
如果有人能帮我找到这个错误,那将是一个很大的帮助

我就是想不明白。第一张牌怎么换第七张牌 视图是否相互关联

使用
RecyclerView
的意义在于
视图被回收。
您可以设置
ImageButton
的颜色过滤器,但同样的按钮也可以在循环的
视图中使用

您应该存储
RecyclerView
行的单击状态,并在
onBindViewHolder()
中的每个
ImageButton
上相应地设置颜色过滤器

例如:

// a HashSet to store the clicked positions
private HashSet<Integer> clickedPositions = new HashSet<>();

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    final ViewHolder mHolder = holder;
    mHolder.personName.setText(persons.get(position).name);
    mHolder.personAge.setText((persons.get(position).age));

    mHolder.cvCard.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Toast.makeText(mContext, "card number:" + String.valueOf(position),
                    Toast.LENGTH_SHORT).show();
        }
    });

    if (clickedPositions.contains(mHolder.getAdapterPosition())) {
        // the current item is clicked, change its color
        mHolder.alarmImageButton.setColorFilter(Color.argb(255, 255, 255, 255));
    } else {
        // else change it to another color
        mHolder.alarmImageButton.setColorFilter(Color.argb(0, 0, 0, 0));
    }

    mHolder.alarmImageButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Toast.makeText(mContext, "button:" + String.valueOf(position),
                    Toast.LENGTH_SHORT).show();

            // if the item is already clicked, remove it from the clicked items
            if (!clickedPositions.remove(mHolder.getAdapterPosition())) {
                // if not clicked, add it to the clicked items
                clickedPositions.add(mHolder.getAdapterPosition());
            }
            // and notify the Adapter that the item is changed
            notifyItemChanged(mHolder.getAdapterPosition());
        }
    });
}
//用于存储单击位置的哈希集
私有哈希集clickedPositions=新哈希集();
@凌驾
公共无效onBindViewHolder(ViewHolder,int位置){
最终视图持有者mHolder=持有者;
mHolder.personName.setText(persons.get(position.name));
mHolder.personAge.setText((persons.get(position.age));
mHolder.cvCard.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
Toast.makeText(mContext,“卡号:”+String.valueOf(位置),
吐司。长度(短)。show();
}
});
如果(单击EdPositions.contains(mHolder.getAdapterPosition())){
//如果单击当前项目,请更改其颜色
mHolder.alarmImageButton.setColorFilter(Color.argb(255、255、255、255));
}否则{
//否则将其更改为其他颜色
mHolder.alarmImageButton.setColorFilter(Color.argb(0,0,0,0));
}
mHolder.alarmImageButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
Toast.makeText(McContext,“button:”+String.valueOf(位置),
吐司。长度(短)。show();
//如果已单击该项目,请将其从已单击的项目中删除
如果(!clickedPositions.remove(mHolder.getAdapterPosition())){
//如果未单击,则将其添加到已单击的项目中
单击位置。添加(mHolder.getAdapterPosition());
}
//并通知适配器该项已更改
notifyItemChanged(mHolder.getAdapterPosition());
}
});
}

将ID存储在sparsebooleanarray中。如果颜色改变,则存储为真,否则为假

将这些方法添加到适配器中。
private SparseBooleanArray mSelectedItemsIds;
//选择的方法
公共无效切换选择(内部位置){
选择查看(位置,!mSelectedItemsIds.get(位置));
}
//删除选定的选项
公共选举{
mSelectedItemsIds=new SparseBooleanArray();
notifyDataSetChanged();
}
//将所选位置放入或删除到SparseBooleanArray中
public void selectView(int位置,布尔值){
如果(值)
mSelectedItemsIds.put(位置、值);
其他的
mSelectedItemsIds.delete(位置);
//notifyItemChangedAtPosition(位置);
notifyDataSetChanged();

}
请给我一些时间检查一下这个答案。
// a HashSet to store the clicked positions
private HashSet<Integer> clickedPositions = new HashSet<>();

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    final ViewHolder mHolder = holder;
    mHolder.personName.setText(persons.get(position).name);
    mHolder.personAge.setText((persons.get(position).age));

    mHolder.cvCard.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Toast.makeText(mContext, "card number:" + String.valueOf(position),
                    Toast.LENGTH_SHORT).show();
        }
    });

    if (clickedPositions.contains(mHolder.getAdapterPosition())) {
        // the current item is clicked, change its color
        mHolder.alarmImageButton.setColorFilter(Color.argb(255, 255, 255, 255));
    } else {
        // else change it to another color
        mHolder.alarmImageButton.setColorFilter(Color.argb(0, 0, 0, 0));
    }

    mHolder.alarmImageButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Toast.makeText(mContext, "button:" + String.valueOf(position),
                    Toast.LENGTH_SHORT).show();

            // if the item is already clicked, remove it from the clicked items
            if (!clickedPositions.remove(mHolder.getAdapterPosition())) {
                // if not clicked, add it to the clicked items
                clickedPositions.add(mHolder.getAdapterPosition());
            }
            // and notify the Adapter that the item is changed
            notifyItemChanged(mHolder.getAdapterPosition());
        }
    });
}