Java 从recyclerview访问某个按钮并将其更改';背景图像

Java 从recyclerview访问某个按钮并将其更改';背景图像,java,android,android-recyclerview,Java,Android,Android Recyclerview,我正在尝试更改在recyclerView中单击某个按钮时的背景图像。按钮的背景图像正在正确更改,但同时也在更改第8..16..etc行中找到的按钮的背景。(我目前正在使用for循环在recycler视图中填充数据以进行测试) 我的代码是 @Override public void onBindViewHolder(final myFirstAdapter.ViewHolder holder, int position) { firstlistitem listItem = listI

我正在尝试更改在recyclerView中单击某个按钮时的背景图像。按钮的背景图像正在正确更改,但同时也在更改第8..16..etc行中找到的按钮的背景。(我目前正在使用for循环在recycler视图中填充数据以进行测试)

我的代码是

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

    firstlistitem listItem = listItems.get(position);

    holder.itemView.setTag(position);
    holder.btnBookMark.setTag(position);

    holder.btnBookMark.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {                 
    holder.btnBookMark.setBackgroundResource(R.drawable.bookmarkred);
            }
    });
}

背景正在改变,因为它是一个RecyclerView,它会回收视图并重用它。因此,当您单击第8个位置并滚动到底部时,它将使用8个位置的项目和其他项目的自定义背景。由于这一点,您将为稍后的滚动项目获得自定义背景

如果您有许多项目将改变背景,请执行此操作

class ViewHolder extends RecyclerView.ViewHolder{
    boolean newBackground = false;
    Button button

    ViewHolder(View itemView){
        ...
        button.setOnClickListner((v) - > newBackground = true);
    }
}
然后,您可以检查
newBackground
的值,并在
onBindViewHolder()中设置背景

如果一次只有一个项目的背景会更改,那么可以在适配器中声明一个字段,并选中该字段以更改背景

class MyAdapter extends RecyclerView.Adapter<ViewHolder>{

    int newBackgroundPos = -1;

    @Override
    public final void onBindViewHolder(ViewHolder holder, int position) {
        holder.button.setOnClickListener((v) -> newBackGroundPos = position);

       if(position == newBackgroundPos)
           holder.itemView.setBackground(newBackground);
       else
           holder.itemView.setBackground(normalBackground);
    }
}
类MyAdapter扩展了RecyclerView.Adapter{ int newBackgroundPos=-1; @凌驾 BindViewHolder上的公共最终无效(ViewHolder holder,内部位置){ holder.button.setOnClickListener((v)->newBackGroundPos=位置); 如果(位置==newBackgroundPos) 支架.项目视图.立根背景(新背景); 其他的 holder.itemView.setBackground(正常背景); } }
所以你想改变列表中每8个项目的背景,然后是第16个项目,依此类推?不要胡说八道。我只想改变按下按钮的背景。但此代码正在更改按下的按钮以及第8和第16个按钮的背景。由于recyclerview通过循环视图来工作,因此视图已被您更改,即背景颜色及其重新使用,因此您再次看到相同的颜色。所以要处理这个问题,要么使用一个对象来维护状态,要么在drawableThank you Guatam上使用mutate()。这很有道理。我将研究如何做到这一点,并尝试一下。谢谢Saran的回答。我会按你的方式去做,当然会回到你的答案。@SinanNoureddine你得到了预期的输出了吗?恐怕你的解决方案不起作用了,因为它给了我一个错误,lambda表达式在此语言级别不受支持。但是,我可以创建一个与列表大小相同的数组,并在数组的每个索引上检查是否更改了背景。只需替换lambda表达式((v)->newBackGroundPos=position)使用
OnClickListener
,然后在OnClickListener->OnClick方法中粘贴此
newBackGroundPos=position
。出现lambda表达式错误,因为它仅在Java 8中受支持,并且必须使用7