单击RecyclerView内的ImageView时更改图像资源 [英] Change image resource when clicking on ImageView inside the RecyclerView

查看:77
本文介绍了单击RecyclerView内的ImageView时更改图像资源的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

每当我单击设备(单击图像,而不是项目)时,我都试图在recyclerview中的特定位置更改设备的图像资源.我试图将setOnClickListener()放在onBindViewHolder()方法内,但仅影响到最后一项. 这是我的回收站视图

I'm trying to change my device's image resource inside the recyclerview at the specific position whenever i click at it (click at the image, not the item). I tried to put setOnClickListener() inside the onBindViewHolder() method but only the last item affected. 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:

My 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".就像一个开关.有人可以帮助我解决这种情况吗?预先感谢...

When I click to the device's image, if it's on (flag=true), changed to "fan_off". If it's off, change to "fan_on". Just like a switch. Can anyone help me with this situation? Thanks in advance...

推荐答案

首先,在onBindViewHolder()内不需要for循环,因为列表中的所有项目都会调用此方法,而您不需要必须再次为所有项目明确运行循环.

First of all, there's no need of that for loop inside onBindViewHolder(), as this method is called for all the items in the list and you don't have to explicitly run loop for all the items again.

替换这段代码:

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

我们在这里检查标志是true还是false,并且当用户单击按钮时,相应地更改值,以便在调用notifyDataSetChanged()时,它使用标志的新更改的值填充视图,从而使相关视图处于选中状态,或者未选中.

we check here if the flag is true or false and when user clicks on button, change the values accordingly so that when notifyDataSetChanged() is called it populates the views with newly changed values of flags and hence make the relevant views selected or unselected.

这篇关于单击RecyclerView内的ImageView时更改图像资源的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆