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