Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在RecyclerView中单击ImageView时更改图像资源_Java_Android_Android Recyclerview - Fatal编程技术网

Java 在RecyclerView中单击ImageView时更改图像资源

Java 在RecyclerView中单击ImageView时更改图像资源,java,android,android-recyclerview,Java,Android,Android Recyclerview,每当我点击我的设备时,我都会尝试在recyclerview中的特定位置更改设备的图像资源(点击图像,而不是项目)。我试图将setOnClickListener()放在onBindViewHolder()方法中,但只影响最后一项 这是我的适配器: public class Device_RV_Adapter extends RecyclerView.Adapter<Device_View_Holder> { List<Device_Data> list= Collecti

每当我点击我的设备时,我都会尝试在recyclerview中的特定位置更改设备的图像资源(点击图像,而不是项目)。我试图将setOnClickListener()放在onBindViewHolder()方法中,但只影响最后一项

这是我的适配器:

public class Device_RV_Adapter extends RecyclerView.Adapter<Device_View_Holder> {

List<Device_Data> list= Collections.emptyList();
Context context;

public Device_RV_Adapter(List<Device_Data> list,Context context){
    this.list=list;
    this.context = context;
}
@Override
public Device_View_Holder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.device_row_layout,parent,false);
    Device_View_Holder holder = new Device_View_Holder(v);
    return holder;
}

@Override
public void onBindViewHolder(final Device_View_Holder holder, final int position) {

    holder.device_id.setText(list.get(position).device_id);
    holder.home.setText(list.get(position).home_id);
    holder.room.setText(list.get(position).room);
    holder.current.setText(list.get(position).current);
    holder.switch_key.setImageResource(list.get(position).switch_key);
    holder.device.setTag(position);
    holder.device.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            int pos = (int)v.getTag();
            if(list.get(pos).flag==true){
                list.get(pos).flag = false;
            }
            else if(list.get(pos).flag==false){
                list.get(pos).flag = true;
            }
            notifyDataSetChanged();
        }

    });

    if(list.get(position).flag == true)
        holder.device.setImageResource(R.drawable.fan_off);
    else if(list.get(position).flag==false)
        holder.device.setImageResource(R.drawable.fan_on);
}

@Override
public int getItemCount() {
    return list.size();
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView){
    super.onAttachedToRecyclerView(recyclerView);
}
public void insert(int position,Device_Data device_data){
    list.add(position,device_data);
    notifyItemInserted(position);
}
public void remove(Device_Data device_data){
    int position = list.indexOf(device_data);
    list.remove(position);
    notifyItemRemoved(position);
}
和我的数据类:

public class Device_Data {
public String device_id,home_id,room,current;
public int device,switch_key;
boolean flag;
public Device_Data(String device_id, String home_id, String room, String current,int device,int switch_key,boolean flag){
    this.device_id=device_id;
    this.home_id=home_id;
    this.room=room;
    this.current=current;
    this.device=device;
    this.switch_key=switch_key;
    this.flag=flag;
}

当我点击设备的图像时,如果它处于打开状态(flag=true),则更改为“fan_off”。如果关闭,则更改为“风扇打开”。就像一个开关。有人能帮我解决这个问题吗?提前感谢…

首先,对于
onBindViewHolder()中的循环,不需要使用该方法,因为该方法是为列表中的所有项调用的,您不必再次为所有项显式运行循环

替换这段代码:

for(int i=0;i<list.size();i++){
        if(position==i){
                holder.device.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if(list.get(position).flag==true)
                            holder.device.setImageResource(R.drawable.fan_off);
                        else if(list.get(position).flag==false){
                            holder.device.setImageResource(R.drawable.fan_on);
                        }
                    }
                });
            }
    }

我们在这里检查标志是真是假,当用户单击按钮时,相应地更改值,以便在调用notifyDataSetChanged()时,它使用新更改的标志值填充视图,从而选择或取消选择相关视图。

感谢您的帮助,但再次出现相同的错误。只有最后一项生效。您将notifyDataSetChanged()放在onClick()方法之外时出错,因此我将其放在if()和else if()中,但没有任何更改:(@Hungcao将列表的结构发送给我)。bhandari08@gmail.comalso删除onBindViewHolder()holder.device.setImageResource(list.get(position.device)的此行;列表结构是我在上面上传的设备_数据类:)我删除了它,但仍然没有任何更改
for(int i=0;i<list.size();i++){
        if(position==i){
                holder.device.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if(list.get(position).flag==true)
                            holder.device.setImageResource(R.drawable.fan_off);
                        else if(list.get(position).flag==false){
                            holder.device.setImageResource(R.drawable.fan_on);
                        }
                    }
                });
            }
    }
// here setTag is used to attach the position with each view being inflated.

holder.device.setTag(position);
holder.device.setOnClickListener(new View.OnClickListener() {

      @Override
      public void onClick(View v) {
        int pos = (int)v.getTag();
        if(list.get(pos).flag==true){
           list.get(pos).flag = false;
          }
        else{
           list.get(pos).flag = true;
          }
     notifyDataSetChanged();
      }

   });

 if(list.get(position).flag == true)
    holder.device.setImageResource(R.drawable.fan_off);
 else
    holder.device.setImageResource(R.drawable.fan_on);