Android 单击可更改RecyclerView项目的背景图像

Android 单击可更改RecyclerView项目的背景图像,android,textview,Android,Textview,我有一个RecylerView,其中包含一个作为单个项目的文本视图。根据要求,选中当前图像后,单击将更改textView的背景图像 简言之: 单击textViewTV-->检查textViewTV-->的背景图像检查TV的背景图像是否为a,然后将其设为b,反之亦然 请在下面找到我的代码: viewHolder.addRemove.setOnClickListener(new View.OnClickListener() { @Override

我有一个RecylerView,其中包含一个作为单个项目的文本视图。根据要求,选中当前图像后,单击将更改textView的背景图像

简言之:

单击textViewTV-->检查textViewTV-->的背景图像检查TV的背景图像是否为a,然后将其设为b,反之亦然

请在下面找到我的代码:

 viewHolder.addRemove.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            if(viewHolder.clicked==0)
                            {

                                viewHolder.addRemove.setBackgroundResource(R.mipmap.added);
                                viewHolder.clicked=1;
                                groupSlcArray.add(model.getName().trim());
                                Log.d("groupArr", Arrays.toString(groupSlcArray.toArray()));

                            }
                            else
                            {

                                viewHolder.addRemove.setBackgroundResource(R.mipmap.addslcgroup);
                                viewHolder.clicked=0;
                                groupSlcArray.remove(model.getName().trim());
                                Log.d("groupArr", Arrays.toString(groupSlcArray.toArray()));
                            }

                        }
                    });
我无法找到文本视图的背景资源进行检查。需要您的帮助。这个问题可能对某些人来说太简单了。因此,请在投票前,尝试给出一个解决方案,因为我已经尝试了我找到的所有可能的解决方案。提前感谢您尝试以下代码:

holder.textview.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
           if (holder.textview.getBackground() == getResources().getDrawable(R.drawable.a)){
                holder.textview.setBackground(R.drawable.b);
           }
           else{
                holder.textview.setBackground(R.drawable.a);
           }
        }
    });
请尝试以下代码:

holder.textview.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
           if (holder.textview.getBackground() == getResources().getDrawable(R.drawable.a)){
                holder.textview.setBackground(R.drawable.b);
           }
           else{
                holder.textview.setBackground(R.drawable.a);
           }
        }
    });

下面是一个解决方案,可用于更改每个
RecyclerView
项目的背景图像

例如,当前,
RecyclerView
中的每一行都是一个
项目
,您需要再创建一个字段名
textViewBackGround
,以便像这样保留每一行的背景

public class Item{
    ...
    public int textViewBackGround = R.drawable.a; // default image a
}
然后在适配器中

public class MyRecyclerViewAdapter extends RecyclerView.Adapter < MyRecyclerViewAdapter.CustomViewHolder > {
    private List < Item > itemList;
    private Context mContext;

    public MyRecyclerViewAdapter(Context context, List < Item > itemList) {
        this.itemList = itemList;
        this.mContext = context;
    }

    @Override
    public void onBindViewHolder(CustomViewHolder viewHolder, int i) {
        Item item = itemList.get(i);
        viewHolder.textView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // don't need to get the background of your TextView then change the background, just need to check the datasource. Later on, you absolutely will know that check the datasource for change background of item is a correct way not check the background resource
                if (item.textViewBackGround == R.drawable.a) {
                    viewHolder.textView.setBackgroundResource(R.drawable.b);
                    item.textViewBackGround = R.drawable.b;
                } else {
                    viewHolder.textView.setBackgroundResource(R.drawable.a);
                    item.textViewBackGround = R.drawable.a;
                }
            }
        });
        viewHolder.textView.setBackgroundResource(item.textViewBackGround); // need to set the background image for `TextView` everytime bind ViewHolder because RecyclerView item will recycle when you scroll (if you don't understand it, you can remove this line, run your app, scroll up/down and you will understand it)  
        ...
    }

    class CustomViewHolder extends RecyclerView.ViewHolder {
        protected TextView textView;

        public CustomViewHolder(View view) {
            super(view);
            ...
        }
    }
}
公共类MyRecycleServiceAdapter扩展了RecycleView.Adapter{
私有列表<项目>项目列表;
私有上下文;
公共MyRecycleServiceAdapter(上下文,列表<项>项列表){
this.itemList=itemList;
this.mContext=上下文;
}
@凌驾
BindViewHolder上的公共无效(CustomViewHolder viewHolder,int i){
Item=itemList.get(i);
viewHolder.textView.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
//不需要获取文本视图的背景,然后更改背景,只需要检查数据源。稍后,您绝对会知道,检查数据源以更改项的背景是正确的方法,而不是检查背景资源
if(item.textViewBackGround==R.drawable.a){
viewHolder.textView.setBackgroundResource(R.drawable.b);
item.textViewBackGround=R.drawable.b;
}否则{
viewHolder.textView.setBackgroundResource(R.drawable.a);
item.textViewBackGround=R.drawable.a;
}
}
});
viewHolder.textView.setBackgroundResource(item.textViewBackGround);//每次绑定viewHolder时都需要设置“textView”的背景图像,因为当你滚动时,RecyclerView项目会循环(如果你不理解,你可以删除此行,运行你的应用程序,上下滚动,你就会理解它)
...
}
类CustomViewHolder扩展了RecyclerView.ViewHolder{
受保护的文本视图文本视图;
公共CustomViewHolder(视图){
超级(视图);
...
}
}
}

这里有一个解决方案,您可以使用它更改每个
回收视图
项目的背景图像

例如,当前,
RecyclerView
中的每一行都是一个
项目
,您需要再创建一个字段名
textViewBackGround
,以便像这样保留每一行的背景

public class Item{
    ...
    public int textViewBackGround = R.drawable.a; // default image a
}
然后在适配器中

public class MyRecyclerViewAdapter extends RecyclerView.Adapter < MyRecyclerViewAdapter.CustomViewHolder > {
    private List < Item > itemList;
    private Context mContext;

    public MyRecyclerViewAdapter(Context context, List < Item > itemList) {
        this.itemList = itemList;
        this.mContext = context;
    }

    @Override
    public void onBindViewHolder(CustomViewHolder viewHolder, int i) {
        Item item = itemList.get(i);
        viewHolder.textView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // don't need to get the background of your TextView then change the background, just need to check the datasource. Later on, you absolutely will know that check the datasource for change background of item is a correct way not check the background resource
                if (item.textViewBackGround == R.drawable.a) {
                    viewHolder.textView.setBackgroundResource(R.drawable.b);
                    item.textViewBackGround = R.drawable.b;
                } else {
                    viewHolder.textView.setBackgroundResource(R.drawable.a);
                    item.textViewBackGround = R.drawable.a;
                }
            }
        });
        viewHolder.textView.setBackgroundResource(item.textViewBackGround); // need to set the background image for `TextView` everytime bind ViewHolder because RecyclerView item will recycle when you scroll (if you don't understand it, you can remove this line, run your app, scroll up/down and you will understand it)  
        ...
    }

    class CustomViewHolder extends RecyclerView.ViewHolder {
        protected TextView textView;

        public CustomViewHolder(View view) {
            super(view);
            ...
        }
    }
}
公共类MyRecycleServiceAdapter扩展了RecycleView.Adapter{
私有列表<项目>项目列表;
私有上下文;
公共MyRecycleServiceAdapter(上下文,列表<项>项列表){
this.itemList=itemList;
this.mContext=上下文;
}
@凌驾
BindViewHolder上的公共无效(CustomViewHolder viewHolder,int i){
Item=itemList.get(i);
viewHolder.textView.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
//不需要获取文本视图的背景,然后更改背景,只需要检查数据源。稍后,您绝对会知道,检查数据源以更改项的背景是正确的方法,而不是检查背景资源
if(item.textViewBackGround==R.drawable.a){
viewHolder.textView.setBackgroundResource(R.drawable.b);
item.textViewBackGround=R.drawable.b;
}否则{
viewHolder.textView.setBackgroundResource(R.drawable.a);
item.textViewBackGround=R.drawable.a;
}
}
});
viewHolder.textView.setBackgroundResource(item.textViewBackGround);//每次绑定viewHolder时都需要设置“textView”的背景图像,因为当你滚动时,RecyclerView项目会循环(如果你不理解,你可以删除此行,运行你的应用程序,上下滚动,你就会理解它)
...
}
类CustomViewHolder扩展了RecyclerView.ViewHolder{
受保护的文本视图文本视图;
公共CustomViewHolder(视图){
超级(视图);
...
}
}
}

您必须了解getView。 有时,如果在ListView中滚动,这不是一个精确的颜色

因此,我建议采取以下方式:

1.在getView上添加代码 2.更改OnClickListener事件代码
您必须了解getView。 有时,如果在ListView中滚动,这不是一个精确的颜色

因此,我建议采取以下方式:

1.在getView上添加代码 2.更改OnClickListener事件代码
你能给我看一下你的代码吗?@IntelliJAmiya:已经尝试过了,但得到了一个空指针异常。java.lang.NullPointerException:尝试在null对象上调用虚拟方法“int java.lang.Integer.intValue()”reference@red_allocator:请查找更新的问题。我可以更改背景图像