代码之家  ›  专栏  ›  技术社区  ›  jobin

Android RecyclerView复选框会自动检查

  •  1
  • jobin  · 技术社区  · 6 年前

    我有一个有复选框和文本视图编号10,20,30,40。。。直到500应该显示在文本视图选中的复选框应该在文本视图中添加与复选框。用于如果用户只检查值10,文本视图将显示10。如果用户也检查20,那么 文本视图将显示30(20+10)。

    回收适配器.java:

    public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.RecyclerHolder>
        {
    
            @NonNull
            @Override
            public RecyclerHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                return new RecyclerHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_lyt,parent,false));
            }
    
            @Override
            public void onBindViewHolder(@NonNull RecyclerHolder holder, final int position) {
                holder.number.setText(Integer.toString((Integer) alldata.get(position)));
                final String text=holder.number.getText().toString();
    
    
                holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                    @Override
                    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                        Log.e("Checked","Checked");
                        if(checkeddata!=null)
                        {
                            if (checkeddata.size()==0)
                            {
                                checkeddata.add(text);
    
                            }
                            else {
                                if(checkeddata.contains(text))
                                {
                                    checkeddata.remove(text);
    
    
                                }
                                else {
                                    checkeddata.add(text);
    
                            }
                            }
                            Iterator iterator=checkeddata.iterator();
                            int sumnumber=0;
                            while (iterator.hasNext())
                            {
                                sumnumber= sumnumber+Integer.parseInt((String) iterator.next());
                            }
                            sum.setText(Integer.toString(sumnumber));
                        }
    
    
                    }
                });
    
    
            }
    
            @Override
            public int getItemCount() {
                return alldata.size();
            }
    
            public class RecyclerHolder extends RecyclerView.ViewHolder
            {
                TextView number;
                CheckBox checkBox;
                public RecyclerHolder(View itemView) {
                    super(itemView);
                    number=itemView.findViewById(R.id.number);
                    checkBox=itemView.findViewById(R.id.check);
    
    
                }
            }
        }
        public void data()
        {
            int g=1;
            for(int i=10;i<=500;i++)
            {
                if((i/10)==g)
                {
                    g=g+1;
                    alldata.add(i);
                }
    
            }
        }
    

    回收商_lyt.xml文件:

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        xmlns:app="http://schemas.android.com/apk/res-auto">
    <TextView
        android:layout_width="150dp"
        android:layout_height="wrap_content"
        android:id="@+id/number"
        android:textSize="20sp"/>
        <CheckBox
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/check"
            android:checked="false"
            app:layout_constraintRight_toRightOf="parent"/>
    </android.support.constraint.ConstraintLayout>
    
    6 回复  |  直到 6 年前
        1
  •  1
  •   MarcinR    6 年前

    必须存储复选框状态。可以在模型中执行此操作,例如:

    class Model {
        String title;
        boolean checked;
    }
    

    下一步你必须通过 List Model 将项目添加到适配器,然后选中/取消选中由您的型号确定的复选框。

    if (listOfItems.get(position).checked) {
        viewHolder.checkbox.setChecked(true);
    } else {
        viewHolder.checkbox.setChecked(false);
    }
    

    请记住,您始终需要在适配器中管理视图的相反状态(如复选框或视图的可见性)。

        2
  •  1
  •   MadLeo    6 年前

    这很正常。您没有将复选框设置为选中状态。您正在选择一个,视图保持器保持选中状态

    你可以看看我的例子。你可以这样做:

    @Override
        public void onBindViewHolder(ViewHolder holder, final int position) {
            final Data data = myItems.get(position);
    
            //in some cases, it will prevent unwanted situations
            holder.checkBox.setOnCheckedChangeListener(null);
    
            //if true, your checkbox will be selected, else unselected
            holder.checkBox.setChecked(data.isSelected());
    
            holder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
                    @Override
                    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                        //set your object's last status
                        data.setSelected(isChecked);
                }
            });
    
        }
    

    在你的 onBindViewHolder 如果为true,则选中复选框,否则取消选中

    holder.checkBox.setChecked(boolean);
    
        3
  •  0
  •   Shubham Vala    6 年前

    试试这个:

    public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.RecyclerHolder>
    {
    private OnClickListener onClickListener;
    private int sum =0;
    
        @NonNull
        @Override
        public RecyclerHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            return new RecyclerHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_lyt,parent,false));
        }
    
        @Override
        public void onBindViewHolder(@NonNull RecyclerHolder holder, final int position) {
            holder.number.setText(Integer.toString((Integer) alldata.get(position)));
            final String text=holder.number.getText().toString();
    
    
            holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    if(isChecked){
                        sum += Integer.parseInt(holder.number.getText().toString());
                    }else{
                        sum -= Integer.parseInt(holder.number.getText().toString());
                    }
                    if (onClickListener != null) {
                        onClickListener.onItemClick(sum);
                    }
            });
    
    
        }
    
        @Override
        public int getItemCount() {
            return alldata.size();
        }
    
        public class RecyclerHolder extends RecyclerView.ViewHolder
        {
            TextView number;
            CheckBox checkBox;
            public RecyclerHolder(View itemView) {
                super(itemView);
                number=itemView.findViewById(R.id.number);
                checkBox=itemView.findViewById(R.id.check);
    
    
            }
        }
    
        public void setOnClickListener(OnClickListener onClickListener) {
            this.onClickListener = onClickListener;
        }
    
        public interface OnClickListener {
            void onItemClick(int sum);
        }
    }
    

    adapter

    private RecyclerAdapter adapter;
    ...
    ...
    cardAdapter.setOnClickListener(new CardAdapter.OnClickListener() {
            @Override
            public void onItemClick(int sum) {
                txtSum.setText(String.valueOf(sum));
        });
    
        4
  •  0
  •   Anu Bhalla    6 年前

    您需要在模型类中有一个字段(比如“isSelected”),这样所有选中的条目都可以跟踪。你可以尝试以下操作:

    checkboxRecyclerView

        5
  •  0
  •   glagarto    6 年前

    基本上,RecyclerView循环使用视图,因此您需要一个模型来存储复选框的状态。

    public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.RecyclerHolder> {
    
        private List<Model> alldata = new ArrayList<>();
    
        @NonNull
        @Override
        public RecyclerHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            return new RecyclerHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_lyt, parent, false));
        }
    
        @Override
        public void onBindViewHolder(@NonNull RecyclerHolder holder, final int position) {
            final Model model = alldata.get(position);
    
            holder.number.setText(String.valueOf(model.value));
            holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    model.setChecked(isChecked); // Saves the state of the checkbox.
    
                    if (checkeddata != null) {
                        if (checkeddata.size() == 0) {
                            checkeddata.add(text);
    
                        } else {
                            if (checkeddata.contains(model.getValue())) {
                                checkeddata.remove(model.getValue());
    
    
                            } else {
                                checkeddata.add(model.getValue());
    
                            }
                        }
                        Iterator iterator = checkeddata.iterator();
                        int sumnumber = 0;
                        while (iterator.hasNext()) {
                            sumnumber = sumnumber + Integer.parseInt((String) iterator.next());
                        }
                        sum.setText(Integer.toString(sumnumber));
                    }
                }
            });
            holder.checkBox.setChecked(model.isChecked()); // Retrieves the state of your checkbox.
        }
    
        @Override
        public int getItemCount() {
            return alldata.size();
        }
    
        public class RecyclerHolder extends RecyclerView.ViewHolder {
            TextView number;
            CheckBox checkBox;
    
            public RecyclerHolder(View itemView) {
                super(itemView);
                number = itemView.findViewById(R.id.number);
                checkBox = itemView.findViewById(R.id.check);
            }
        }
    
        public void data() {
            int g = 1;
            for (int i = 10; i <= 500; i++) {
                if ((i / 10) == g) {
                    g = g + 1;
                    alldata.add(new Model(i));
                }
            }
        }
    
        private class Model {
            private int value;
            private boolean checked = false;
    
            Model(int value) {
                this.value = value;
            }
    
            public int getValue() {
                return value;
            }
    
            public boolean isChecked() {
                return checked;
            }
    
            public void setChecked(boolean checked) {
                this.checked = checked;
            }
        }
    }
    
        6
  •  0
  •   user8959091 user8959091    6 年前

    如果您进行了必要的更改以存储复选框的状态,则:
    在里面 onBindViewHolder() final String text=holder.number.getText().toString(); 添加以下内容:

    holder.checkBox.setOnCheckedChangeListener(null);
    holder.checkBox.setChecked(-- stored value --);
    

    然后为复选框添加侦听器。