【问题标题】:Get list of checked checkboxes from recyclerview android从recyclerview android获取选中的复选框列表
【发布时间】:2015-10-30 11:11:06
【问题描述】:

我已经用图像、标题和复选框填充了 recyclerView。 我有两个问题。

  1. 如何在单击 imageview 或整个回收站项目时选中复选框。

  2. 我必须通过从 recyclerview 中获取所有选中的项目来进行下一个活动。

我的布局:

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="8dp">

    <ImageView
        android:id="@+id/image"
        android:layout_width="match_parent"
        android:layout_height="150dp"
        android:layout_gravity="center_horizontal"
        android:contentDescription="Interests"
        android:scaleType="centerCrop"
        android:src="@drawable/ic_yash_dp" />

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_gravity="bottom"
        android:layout_margin="5dp"
        android:layout_marginTop="24dp"
        android:background="@drawable/rounded_corners"
        android:gravity="bottom"
        android:padding="5dp"
        android:text="GYM"
        android:textAlignment="center"
        android:textColor="@color/white" />

    <CheckBox
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/checkBox"
        android:layout_margin="2dp"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

</RelativeLayout>

我的适配器:

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

    final InterestBean model = arrayList.get(position);
    final int pos = position;

    RecyclerViewHolder mainHolder = (RecyclerViewHolder) holder;// holder

    Bitmap image = BitmapFactory.decodeResource(context.getResources(),
    model.getImage());// This will convert drawbale image into bitmap

    // setting title
    mainHolder.title.setText(model.getTitle());
    mainHolder.imageview.setImageBitmap(image);
    mainHolder.checkBox.setChecked(arrayList.get(position).isSelected());
    mainHolder.checkBox.setTag(arrayList.get(position));

    mainHolder.checkBox.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            CheckBox cb = (CheckBox) v;
            InterestBean contact = (InterestBean) cb.getTag();

            contact.setIsSelected(cb.isChecked());
            arrayList.get(pos).setIsSelected(cb.isChecked());
            selectedItems.add(pos);
            Toast.makeText(v.getContext(), pos + cb.isChecked(), Toast.LENGTH_LONG).show();
        }
    });
}

【问题讨论】:

    标签: android checkbox android-recyclerview


    【解决方案1】:

    一个简单的解决方案是创建OnItemCheckLister,并按如下方式实现它:

    public class MyAdapter extends RecyclerViewAdapter {
    
        interface OnItemCheckListener {
            void onItemCheck(Item item);
            void onItemUncheck(Item item);
        }
    
        ...
    
        @NonNull
        private OnItemCheckListener onItemClick;
    
        public MyAdapter (List<Item> items, @NonNull OnItemCheckListener onItemCheckListener) {
            this.items = items;
            this.onItemClick = onItemCheckListener;
        }
    
        ...
    
        @Override
        public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
            if (holder instanceof MyViewHolder) {
                final Item currentItem = items.get(position);
    
                ...
         
                ((MyViewHolder) holder).setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        ((MyViewHolder) holder).checkbox.setChecked(
                                !((MyViewHolder) holder).checkbox.isChecked());
                        if (((MyViewHolder) holder).checkbox.isChecked()) {
                            onItemClick.onItemCheck(currentItem);
                        } else {
                            onItemClick.onItemUncheck(currentItem);
                        }
                    }
                });
            }
        }
    
        static class MyViewHolder extends RecyclerView.ViewHolder {
            CheckBox checkbox;
            View itemView;
    
            ...
    
            public MyViewHolder(View itemView) {
                super(itemView);
                this.itemView = itemView;
                checkbox = (CheckBox) itemView.findViewById(R.id.checkbox);
                checkbox.setClickable(false);
                ...
            }
    
            public void setOnClickListener(View.OnClickListener onClickListener) {
                itemView.setOnClickListener(onClickListener);
            }
        }
    }
    

    那么在activity中,我们可以这样做:

        private List<Item> currentSelectedItems = new ArrayList<>();
        
        ...
    
        myAdapter = new MyAdapter(items, new MyAdapter.OnItemCheckListener() {
                @Override
                public void onItemCheck(Item item) {
                    currentSelectedItems.add(item);
                }
    
                @Override
                public void onItemUncheck(Item item) {
                    currentSelectedItems.remove(item);
                }
            });
    

    然后你就可以用currentSelectedItems 做事了。

    注意:由于此解决方案假设要按下整个项目,因此复选框设置为不可点击。

    【讨论】:

    • 这简直太棒了,人们请使用这个解决方案!
    • 它的工厂使用:)
    • 嘿@ninjahoahong 我在“onItemClick.onItemUncheck(currentItem);”上遇到错误这条线。我的错误是:尝试在空对象引用上调用接口方法。请帮忙!!
    • @akshayashok 你是如何初始化你的itemsadapters 的?
    • 这个解决方案是一个很好的开始。我注意到当我的回收站变长时,奇怪的行为开始发生。与其使用视图持有者来检查项目是否被选中,不如将该状态保留为List&lt;item&gt; 的一部分,这样,当回收器开始重用视图持有者时,is.checked() 会被保留。这是帮助解决此问题的一个很好的示例:stackoverflow.com/a/32428115/8890753
    【解决方案2】:

    您可以使用 Model 类来获取 recyclerView 选中的项目。更多参考:Android Recyclerview checkbox

    型号

    public class Model {
    
        private boolean isSelected;
        private String animal;
    
        public String getAnimal() {
            return animal;
        }
    
        public void setAnimal(String animal) {
            this.animal = animal;
        }
    
        public boolean getSelected() {
            return isSelected;
        }
    
        public void setSelected(boolean selected) {
            isSelected = selected;
        }
    }
    

    适配器

    import android.content.Context;
     import android.support.v7.widget.RecyclerView;
    import android.view.LayoutInflater;
        import android.view.View;
     import android.view.ViewGroup;
     import android.widget.CheckBox;
     import android.widget.TextView;
     import android.widget.Toast;
    
     import java.util.ArrayList;
    
    
      public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.MyViewHolder> {
    
    private LayoutInflater inflater;
    public static ArrayList<Model> imageModelArrayList;
    private Context ctx;
    
    public CustomAdapter(Context ctx, ArrayList<Model> imageModelArrayList) {
    
        inflater = LayoutInflater.from(ctx);
        this.imageModelArrayList = imageModelArrayList;
        this.ctx = ctx;
    }
    
    @Override
    public CustomAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    
        View view = inflater.inflate(R.layout.rv_item, parent, false);
        MyViewHolder holder = new MyViewHolder(view);
    
        return holder;
    }
    
    @Override
    public void onBindViewHolder(final CustomAdapter.MyViewHolder holder, int position) {
    
        holder.checkBox.setText("Checkbox " + position);
        holder.checkBox.setChecked(imageModelArrayList.get(position).getSelected());
        holder.tvAnimal.setText(imageModelArrayList.get(position).getAnimal());
    
       // holder.checkBox.setTag(R.integer.btnplusview, convertView);
        holder.checkBox.setTag(position);
        holder.checkBox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
    
                Integer pos = (Integer) holder.checkBox.getTag();
                Toast.makeText(ctx, imageModelArrayList.get(pos).getAnimal() + " clicked!", Toast.LENGTH_SHORT).show();
    
                if (imageModelArrayList.get(pos).getSelected()) {
                    imageModelArrayList.get(pos).setSelected(false);
                } else {
                    imageModelArrayList.get(pos).setSelected(true);
                }
            }
        });
    
    
    }
    
    @Override
    public int getItemCount() {
        return imageModelArrayList.size();
    }
    
    class MyViewHolder extends RecyclerView.ViewHolder {
    
        protected CheckBox checkBox;
        private TextView tvAnimal;
    
        public MyViewHolder(View itemView) {
            super(itemView);
    
            checkBox = (CheckBox) itemView.findViewById(R.id.cb);
            tvAnimal = (TextView) itemView.findViewById(R.id.animal);
        }
    
    }
    

    【讨论】:

    • 如果您在多个具有不同排序顺序或不同检查状态目的的不同回收视图中使用模型对象,则必须为每个对象添加不同的布尔值。保存带有 id 或 key 的列表以及每个目的的状态会更省力。
    • 我们可以在不使用 isSelected 的情况下做到这一点,因为我正在使用 Realm 的联系人对象
    【解决方案3】:

    首先在穆德尔类中设置一个布尔值

    并单击复选框传递布尔值 true

    并通过以下方法检查所有复选框是否被单击

     fun isListContainMethod(arraylist: List<Puzzle>): Boolean {
        for (puzzle in arraylist) {
            if (!puzzle.isSelect) {
                return false
            }
        }
        return true
    }
    

    【讨论】:

      【解决方案4】:

      1) 您可以添加 mainHolder.imageview OnClickListener
      2)两步:

      1. 添加到 InterestBean 模型 boolen isChecked
      2. 去哪里下一个活动,获取所有的InterestBeans,获取所有选中的InterestBeans 并保存。

      代码:

      mainHolder.imageview.setOnClickListener(new View.OnClickListener()
      {
          public void onClick (View v)
          {
              mainHolder.checkBox.setChecked(!mainHolder.checkBox.isChecked());
          }
      });
      

      【讨论】:

      • 如何在图片点击监听器上设置复选框。
      • mainHolder.imageview.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 如何设置它? } });
      【解决方案5】:

      来自@ninjahoahong 我在 onBindViewHolder 方法中添加了复选框监听器,并且复选框可以点击。

      viewHolder.checkBox.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              int pos = viewHolder.getAdapterPosition();
              ChoiceItem currentItem = mChoice.get(pos);
              if(viewHolder.checkBox.isChecked()){
                  onItemCheckListener.onItemCheck(currentItem);
                  currentItem.setCheck(true);
              }else{
                  onItemCheckListener.onItemUncheck(currentItem);
                  currentItem.setCheck(false);
              }
          }
      });
      

      【讨论】:

        【解决方案6】:
        recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getApplicationContext(), recyclerView, new RecyclerTouchListener.ClickListener() {
            @Override
            public void onClick(View view, int position) {
                List list= aList.get(position);
                //Toast.makeText(getApplicationContext(), movie.getTitle() + " is selected!", Toast.LENGTH_SHORT).show();
                action(list.getId());
            }
        
            @Override
            public void onLongClick(View view, int position) {
        
            }
        }));
        

        【讨论】:

        • 请添加一些简短的说明您所做的特别之处。
        【解决方案7】:

        这对我有用,也对你有用 只需创建静态列表,我在 MainActivity.java 上创建它

        public static List<String> myItems = new ArrayList<>();
        

        在 YouAdapter.class 中创建 setOnCheckedChangeListener

        holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                    if(b){
                        myItems.add(Model.getYouItem());
                    }
                    else{
                        myItems.remove(Model.getYouItem());
                    }
                }
            });
        

        现在您可以使用您的 myItems 列表来执行操作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-28
          • 1970-01-01
          • 1970-01-01
          • 2017-04-18
          • 2016-11-06
          • 1970-01-01
          相关资源
          最近更新 更多