ListView中的CheckBox

Android 专栏收录该内容
83 篇文章 0 订阅

ListView中的CheckBox相信大家都不会陌生了,基本都会遇到,类似于全选,提交所选择的数据

这是我实际项目中的界面,未做修饰,请随意吐槽界面,哈哈

这里写图片描述

相对应的item中也会存在CheckBox,图就不上了

直接上item文件的代码

// 一般加上这句话之后,你的CheckBox和ListView就不会冲突了
android:descendantFocusability="blocksDescendants"
<?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:orientation="vertical"
    <!--注意这句话,最好是加上-->
    android:descendantFocusability="blocksDescendants" >

    <View
        android:layout_width="fill_parent"
        android:layout_height="1dp"
        android:background="#FFFFFF" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#EAEBEC"
        android:gravity="center_vertical"
        android:paddingBottom="4dp"
        android:paddingTop="4dp" >

        <LinearLayout
            android:id="@+id/layout_chb"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#EAEBEC"
            android:gravity="center_vertical|right"
            android:visibility="gone"
            android:orientation="horizontal" >

            <CheckBox
                android:id="@+id/cb_select"
                android:layout_width="30dp"
                android:layout_height="30dp"
                android:layout_marginLeft="10dp"
                android:button="@drawable/check_doctor_selector" />
        </LinearLayout>

        <TextView
            android:id="@+id/comp_orderTime"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:textColor="#BDC2C4" />

        <TextView
            android:id="@+id/comp_orderTime_detail"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:textColor="#BDC2C4" />

        <TextView
            android:id="@+id/comp_orderStatus"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:gravity="right"
            android:textColor="#BDC2C4" />
    </LinearLayout>

    <View
        android:layout_width="fill_parent"
        android:layout_height="1dp"
        android:background="#FFFFFF" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#F6F6F6"
        android:orientation="vertical"
        android:paddingBottom="4dp"
        android:paddingTop="4dp" >

        <LinearLayout
            android:id="@+id/comp_orderDetail"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >
        </LinearLayout>
    </LinearLayout>

</LinearLayout>

接下来继续说,全选,多选的问题

很多人都是卡在了这个地方,选中之后,滑动一下,发现选中的都没有了,是不是很奇怪,我第一次接触的时候,也是这样的,别着急,让我们分析下为什么

这是因为滑动过程中重绘了整个界面,也就是GetView方法中未做出相应记录,从而导致CheckBox的选中效果丢失了,那么我们所需要做的就是记录下CheckBox的选中效果

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final BHMedicalOrders medicalOrders = getItem(position);
        final ViewHolder holder;
        if (convertView == null) {// R.layout.list_compound_item
            convertView = layoutInflater.inflate(layoutId, null);
            holder = new ViewHolder();
            holder.orderTime = (TextView) convertView.findViewById(R.id.comp_orderTime);
            holder.layout_cb = (LinearLayout) convertView.findViewById(R.id.layout_chb);
            holder.cb_select = (CheckBox) convertView.findViewById(R.id.cb_select);

            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        // 这里边的medicalOrders就是界面数据实体,而uploads就是我们的记录
        if (uploads != null && uploads.size() > 0 && uploads.contains(medicalOrders)) {
            holder.cb_select.setChecked(true);
        } else {
            holder.cb_select.setChecked(false);
        }
        holder.cb_select.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                if (holder.cb_select.isChecked()) {
                    if (!uploads.contains(medicalOrders)) {
                        uploads.add(medicalOrders);
                    }
                } else {
                    if (uploads.contains(medicalOrders)) {
                        uploads.remove(medicalOrders);
                    }
                }
            }
        });
        return convertView;
    }

当然我们还可以使用Map集合的键值对来记录所选,用Boolean的数组来记录当前数据是否被选中

方法很多,但是原理是一样的,效果也是一样的

最后注意一点,在刷新界面的时候,记得把记录的集合清空,要不然数据会混乱

public void notifyData() {
        uploads.clear();
        notifyDataSetChanged();
    }

今天就写这么多吧,有时间我再弄个动态图,补上来

  • 1
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值