RecyclerView使用,item实现全选,反选,单选,计算checkbox选中的个数

activity_main.xml 布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="CheckAll"
            android:text="全选" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:onClick="ReverseCheck"
            android:text="反选" />

        <TextView
            android:id="@+id/checkNumber"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:text="选中 0 个" />
    </LinearLayout>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </android.support.v7.widget.RecyclerView>

</LinearLayout>
//MainActivity 方法中的代码
public class MainActivity extends AppCompatActivity {


    private RecyclerView recyclerview;
    private TextView checkNumber;
    private RecyclerAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerview = (RecyclerView) findViewById(R.id.recyclerview);
        checkNumber = (TextView) findViewById(R.id.checkNumber);

        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        recyclerview.setLayoutManager(linearLayoutManager);
        adapter = new RecyclerAdapter();
        recyclerview.setAdapter(adapter);
        //自定义接口,把选中的个数传过来
        adapter.setOnCheckBoxClickListener(new RecyclerAdapter.OnCheckBoxClickListener() {
            @Override
            public void onClick(View view, int num) {
                checkNumber.setText("选中 " + num + " 个");
            }
        });

    }
    //全选按钮的点击事件
    public void CheckAll(View view) {
        //调用自定义接口方法,设置全选
        adapter.CheckedAllItem();
        //调用自定义的方法,计算选中的个数,然后设置到TextView上面
        int checkedNumber = adapter.getCheckedNumber();
        checkNumber.setText("选中 " + checkedNumber + " 个");
    }
    //反选按钮的点击事件
    public void ReverseCheck(View view) {
        //调用自定义接口方法,设置反选
        adapter.ReverseCheckItem();
        //调用自定义的方法,计算选中的个数,然后设置到TextView上面
        int checkedNumber = adapter.getCheckedNumber();
        checkNumber.setText("选中 " + checkedNumber + " 个");
    }
}
//RecyclerView适配器,完成全选,单选,和计算选中的个数,以及单选
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.MyViewHolder> {

    private HashMap<Integer, Boolean> map;
    private ArrayList<String> list;

    public RecyclerAdapter() {
        list = new ArrayList<>();
        map = new HashMap<>();
        for (int i = 0; i < 30; i++) {
            list.add("item" + i);
            map.put(i, false);
        }
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final MyViewHolder holder, final int position) {
        holder.item_tv.setText(list.get(position));

        holder.checkbox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                map.put(position, !map.get(position));
//                CheckOleyOne(position);
                //点击的时候计算选中的个数
                int checkedNumber = getCheckedNumber();
                notifyDataSetChanged();
                mOnCheckBoxClickListener.onClick(v, checkedNumber);
            }
        });

        holder.checkbox.setChecked(map.get(position));
    }

    private OnCheckBoxClickListener mOnCheckBoxClickListener;

    public interface OnCheckBoxClickListener {
        void onClick(View view, int num);
    }

    public void setOnCheckBoxClickListener(OnCheckBoxClickListener mOnCheckBoxClickListener) {
        this.mOnCheckBoxClickListener = mOnCheckBoxClickListener;
    }

    //得到选中的数量
    public int getCheckedNumber() {
        int Number = 0;
        Set<Map.Entry<Integer, Boolean>> set = map.entrySet();
        //判断是否有未选中的,如果有未选中isChecked = true;退出循环
        for (Map.Entry<Integer, Boolean> entry : set) {
            if (entry.getValue() && Number <= list.size()) {
                Number += 1;
            }
        }
        return Number;
    }

    //全选方法
    public void CheckedAllItem() {
        Set<Map.Entry<Integer, Boolean>> set = map.entrySet();
        boolean isChecked = false;
        //判断是否有未选中的,如果有未选中isChecked = true;退出循环
        for (Map.Entry<Integer, Boolean> entry : set) {
            if (entry.getValue() == false) {
                isChecked = true;
                break;
            }
        }
        //如果有未选中的 isChecked = true;就把所有item的checkbox设置成true,反之就是全选中了.设置成全不选中
        for (Map.Entry<Integer, Boolean> entry : set) {
            entry.setValue(isChecked);
        }
        getCheckedNumber();
        notifyDataSetChanged();
    }

    //反选方法
    public void ReverseCheckItem() {
        Set<Map.Entry<Integer, Boolean>> entries = map.entrySet();
        for (Map.Entry<Integer, Boolean> set : entries) {
            set.setValue(!set.getValue());
        }
        getCheckedNumber();
        notifyDataSetChanged();
    }

    //单选
    public void CheckOleyOne(int position) {
        Set<Map.Entry<Integer, Boolean>> entries = map.entrySet();
        for (Map.Entry<Integer, Boolean> entry : entries) {
            entry.setValue(false);
        }
        map.put(position, true);
        notifyDataSetChanged();
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    class MyViewHolder extends RecyclerView.ViewHolder {

        private TextView item_tv;
        private CheckBox checkbox;

        public MyViewHolder(View itemView) {
            super(itemView);
            item_tv = (TextView) itemView.findViewById(R.id.item_tv);
            checkbox = (CheckBox) itemView.findViewById(R.id.checkbox);
        }
    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值