【问题标题】:Change image resource when clicking on ImageView inside the RecyclerView单击 RecyclerView 内的 ImageView 时更改图像资源
【发布时间】:2016-12-12 19:35:10
【问题描述】:

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

这是我的适配器:

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);
}

我的 ViewHolder:

public class Device_View_Holder extends RecyclerView.ViewHolder{

CardView cv;
TextView device_id,home,room,current;
public static ImageView device, switch_key;
boolean flag;
public Device_View_Holder(View itemView) {
    super(itemView);
    cv=(CardView)itemView.findViewById(R.id.device_cv);
    device_id=(TextView)itemView.findViewById(R.id.device_id);
    home=(TextView)itemView.findViewById(R.id.home_id);
    room=(TextView)itemView.findViewById(R.id.room);
    current=(TextView)itemView.findViewById(R.id.current);
    device=(ImageView)itemView.findViewById(R.id.device_img);
    switch_key=(ImageView)itemView.findViewById(R.id.switch_key);
}

还有我的数据类:

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”。如果它关闭,请更改为“fan_on”。就像一个开关一样。任何人都可以帮助我解决这种情况吗?提前谢谢...

【问题讨论】:

    标签: java android android-recyclerview


    【解决方案1】:

    首先,onBindViewHolder() 内不需要 for 循环,因为此方法会针对列表中的所有项目调用,并且您不必再次为所有项目显式运行循环。

    替换这段代码:

    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);
    

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

    【讨论】:

    • 感谢您的帮助,但又出现了同样的错误。只有最后一项生效。您将 notifyDataSetChanged() 放在 onClick() 方法之外有一个错误,所以我将它放在 if() 和 else if() 中,但没有任何改变:(
    • @Hungcao 在这里将您的列表结构发送给我 ravinder.bhandari08@gmail.com
    • 也为 onBindViewHolder() holder.device.setImageResource(list.get(position).device); 删除这一行;
    • 列表结构是我上面上传的Device_Data类:)
    • 我删除了它,但仍然没有任何变化
    猜你喜欢
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 2011-11-01
    • 2018-06-16
    • 1970-01-01
    • 2017-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多