RecyclerView+CheckBox实现列表数据选择操作

organicfrog 发布于6月前 阅读466次
0 条评论

这些时间做安卓盒子项目,因为安卓电视的显示器比较大,所以一个界面显示 很多数据 ,最多的时候,一个Actvity中用到了好几个RecyclerView。
  在RecyclerView中实现Item选中处理时,发现用CheckBox的OnCheckedChangeListener监听事件时,会达不到预期,所以用了OnClickListener来实现。

主界面代码:

public class CheckRecyclerViewActivity extends AppCompatActivity implements CheckAdapter.CheckItemListener {
    //适配器
    private CheckAdapter mCheckAdapter;
    //列表
    private RecyclerView check_rcy;
    //全选操作
    private CheckBox check_all_cb;
    //列表数据
    private List<CheckBean> dataArray;
    //选中后的数据
    private List<CheckBean> checkedList;
    private boolean isSelectAll;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_check_recyclerview);
        checkedList = new ArrayList<>();
        initDatas();
        initViews();
    }

    private void initViews() {
        check_rcy = (RecyclerView) findViewById(R.id.check_rcy);
        check_all_cb = (CheckBox) findViewById(R.id.check_all_cb);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
        check_rcy.setLayoutManager(linearLayoutManager);
        mCheckAdapter = new CheckAdapter(this, dataArray, this);
        check_rcy.setAdapter(mCheckAdapter);
        //如果使用CheckBox的OnCheckedChangeListener事件,则选中事件会有一些意想不到的结果,欢迎体验
        //在列表Item中的CheckBox也一样的效果
        check_all_cb.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                isSelectAll = !isSelectAll;
                checkedList.clear();
                if (isSelectAll) {//全选处理
                    checkedList.addAll(dataArray);
                }
                for (CheckBean checkBean : dataArray) {
                    checkBean.setChecked(isSelectAll);
                }
                mCheckAdapter.notifyDataSetChanged();
            }
        });
    }

    private void initDatas() {
        dataArray = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            CheckBean bean = new CheckBean();
            bean.setOrder(String.valueOf(i + 1));
            bean.setName("名称_" + i);
            bean.setContent("第" + i + "条内容");
            bean.setTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
            dataArray.add(bean);
        }
    }

    @Override
    public void itemChecked(CheckBean checkBean, boolean isChecked) {
        //处理Item点击选中回调事件
        if (isChecked) {
            //选中处理
            if (!checkedList.contains(checkBean)) {
                checkedList.add(checkBean);
            }
        } else {
            //未选中处理
            if (checkedList.contains(checkBean)) {
                checkedList.remove(checkBean);
            }
        }
        //判断列表数据是否全部选中
        if (checkedList.size() == dataArray.size()) {
            check_all_cb.setChecked(true);
        } else {
            check_all_cb.setChecked(false);
        }
    }
}

列表数据适配器:

public class CheckAdapter extends RecyclerView.Adapter<CheckAdapter.ViewHolder> {
    private Context mContext;
    private List<CheckBean> mDatas;
    private CheckItemListener mCheckListener;

    public CheckAdapter(Context mContext, List<CheckBean> mDatas, CheckItemListener mCheckListener) {
        this.mContext = mContext;
        this.mDatas = mDatas;
        this.mCheckListener = mCheckListener;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.check_recyclerview_item, parent, false);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, final int position) {
        final CheckBean bean = mDatas.get(position);
        holder.item_order_tv.setText(bean.getOrder());
        holder.item_name_tv.setText(bean.getName());
        holder.item_content_tv.setText(bean.getContent());
        holder.item_time_tv.setText(bean.getTime());
        holder.item_cb.setChecked(bean.isChecked());
        //点击实现选择功能,当然可以把点击事件放在item_cb对应的CheckBox上,只是焦点范围较小
        holder.item_content_ll.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                bean.setChecked(!bean.isChecked());
                holder.item_cb.setChecked(bean.isChecked());
                if (null != mCheckListener) {
                    mCheckListener.itemChecked(bean, holder.item_cb.isChecked());
                }
                notifyDataSetChanged();
            }
        });
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder {
        //序号
        private TextView item_order_tv;
        //选择
        private CheckBox item_cb;
        //整个条目
        private LinearLayout item_content_ll;
        //名称
        TextView item_name_tv;
        //内容
        TextView item_content_tv;
        //时间
        private TextView item_time_tv;


        public ViewHolder(View itemView) {
            super(itemView);
            item_order_tv = (TextView) itemView.findViewById(R.id.item_order_tv);
            item_cb = (CheckBox) itemView.findViewById(R.id.item_cb);
            item_name_tv = (TextView) itemView.findViewById(R.id.item_name_tv);
            item_content_tv = (TextView) itemView.findViewById(R.id.item_content_tv);
            item_time_tv = (TextView) itemView.findViewById(R.id.item_time_tv);
            item_content_ll = (LinearLayout) itemView.findViewById(R.id.item_content_ll);
        }
    }

    public interface CheckItemListener {

        void itemChecked(CheckBean checkBean, boolean isChecked);
    }
}

测试数据实体BEAN:

public class CheckBean implements Serializable {
    private String order;
    private String name;
    private String content;
    private String time;
    private boolean isChecked;

    public String getOrder() {
        return order;
    }

    public void setOrder(String order) {
        this.order = order;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }

    public boolean isChecked() {
        return isChecked;
    }

    public void setChecked(boolean checked) {
        isChecked = checked;
    }
}

主界面布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="10dp"
        android:background="@drawable/drawable_white_round_bg"
        android:orientation="vertical">

    <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="20dp"
            android:orientation="horizontal">

        <TextView
                android:layout_width="40dp"
                android:layout_height="match_parent"
                android:text="序号"
                android:layout_marginLeft="10dp"
                android:textSize="12sp"
                android:textColor="#333333"
                android:gravity="center"
                />

        <CheckBox
                android:id="@+id/check_all_cb"
                android:layout_width="12dp"
                android:layout_gravity="center"
                android:button="@null"
                android:layout_marginLeft="10dp"
                android:layout_marginRight="10dp"
                android:layout_height="12dp"
                android:background="@drawable/drawable_cb_selector"
                />

        <TextView
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:text="名称"
                android:layout_marginLeft="10dp"
                android:textSize="12sp"
                android:textColor="#333333"
                android:gravity="center"
                />

        <TextView
                android:layout_width="100dp"
                android:layout_height="match_parent"
                android:text="内容"
                android:layout_marginLeft="10dp"
                android:textSize="12sp"
                android:textColor="#333333"
                android:gravity="center"
                />

        <TextView
                android:layout_width="80dp"
                android:layout_height="match_parent"
                android:text="时间"
                android:layout_marginLeft="10dp"
                android:textSize="12sp"
                android:textColor="#333333"
                android:gravity="center"
                />
    </LinearLayout>

    <View
            android:layout_width="match_parent"
            android:layout_height="1px"
            android:background="#bcbcbc"></View>

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

</LinearLayout>

列表Item布局:

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

    <LinearLayout
            android:id="@+id/item_content_ll"
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:orientation="horizontal">

        <TextView
                android:id="@+id/item_order_tv"
                android:layout_width="40dp"
                android:layout_height="match_parent"
                android:layout_marginLeft="10dp"
                android:textSize="15sp"
                android:textColor="#333333"
                android:gravity="center"
                />

        <CheckBox
                android:id="@+id/item_cb"
                android:layout_width="20dp"
                android:layout_gravity="center"
                android:button="@null"
                android:layout_marginLeft="10dp"
                android:layout_marginRight="10dp"
                android:layout_height="20dp"
                android:background="@drawable/drawable_cb_selector"
                />

        <TextView
                android:id="@+id/item_name_tv"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_marginLeft="10dp"
                android:textSize="15sp"
                android:textColor="#333333"
                android:gravity="center"
                />

        <TextView
                android:id="@+id/item_content_tv"
                android:layout_width="100dp"
                android:layout_height="match_parent"
                android:layout_marginLeft="10dp"
                android:textSize="15sp"
                android:textColor="#333333"
                android:gravity="center"
                />

        <TextView
                android:id="@+id/item_time_tv"
                android:layout_width="120dp"
                android:layout_height="match_parent"
                android:layout_marginLeft="10dp"
                android:textSize="15sp"
                android:textColor="#333333"
                android:gravity="center"
                />
    </LinearLayout>

    <View
            android:layout_width="match_parent"
            android:layout_height="1px"
            android:background="#bcbcbc"/>
</LinearLayout>

界面布局是随意写的,请根据实际情况调整。上丑图:

RecyclerView+CheckBox实现列表数据选择操作

查看原文: RecyclerView+CheckBox实现列表数据选择操作

需要 登录 后回复方可回复, 如果你还没有账号你可以 注册 一个帐号。