android 实现ListView嵌套Checkbox实现真正的多选、全选、反选、取消

Android入门第28天-ListView嵌套CheckBox在滚动时失去选中状态的问题 这一篇会讲解经典的ListView嵌套控件抢焦点,导致了ListView内的checkbox失去选中状态如何处理的问题。同时讲述了如何对一个ListView进行运行时添加、删除行的方法。 阅读详情

android 实现ListView嵌套Checkbox实现真正的多选、全选、反选、取消

        我们在开发APP的时候,很多情况下会使用到ListView嵌套CheckBox的情况,例如购物车选择商品的情况,其实很多人要说这个其实很简单了,并没有那么复杂,事实上并非如此,我们在使用ListView嵌套CheckBox复选框的时候会出现很多问题,接下来我将用一篇博客来说明这些问题,给大家一些参照,解决ListView嵌套Checkbox解决复用问题。

        效果图如下:


首先,我们先看MainActivity中的布局,

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

    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="10"
        android:divider="#808080"
        android:dividerHeight="0.1dp" />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
       android:orientation="horizontal">

        <Button
            android:id="@+id/btn_all_select"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="全选" />

        <Button
            android:id="@+id/btn_all_unselect"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="反选" />

        <Button
            android:id="@+id/btn_delete"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:onClick="delete"
            android:text="删除" />

        <Button
            android:id="@+id/btn_cancel"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="取消" />
    </LinearLayout>
</LinearLayout>
接下来看MainActivity的代码如下:
package com.example.cx.listviewdemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private ListView mLv;
    private Button mBtnSelectAll, mBtnUnSelectAll, mBtnDelete, mBtnCancel;
    //数据源
    private List<String> mDataList;

    //与条目对应的选中状态
    private List<Boolean> mCheckedList;
    private MyAdapter mAdapter;
    
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        mDataList = new ArrayList<String>();
        mCheckedList = new ArrayList<Boolean>();

        for (int i = 0; i < 50; i++) {
            mDataList.add("数据" + i);
            mCheckedList.add(false);
        }
        mAdapter = new MyAdapter(MainActivity.this, mDataList);
        mAdapter.setData(mDataList, mCheckedList);
        mLv.setAdapter(mAdapter);


        mLv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(MainActivity.this, "条目" + position + "被点击了", Toast.LENGTH_SHORT).show();

                mCheckedList.set(position, !mCheckedList.get(position));
                mAdapter.setData(mDataList, mCheckedList);
                mAdapter.notifyDataSetChanged();

            }
        });
    }

    private void initView() {
        mLv = (ListView) findViewById(R.id.lv);
        mBtnSelectAll = findViewById(R.id.btn_all_select);
        mBtnUnSelectAll = findViewById(R.id.btn_all_unselect);
        mBtnDelete = findViewById(R.id.btn_delete);
        mBtnCancel = findViewById(R.id.btn_cancel);

        mBtnSelectAll.setOnClickListener(this);
        mBtnUnSelectAll.setOnClickListener(this);
        mBtnDelete.setOnClickListener(this);
        mBtnCancel.setOnClickListener(this);
    }
    
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            //全选
            case R.id.btn_all_select:
                select_all();
                break;

            //反选
            case R.id.btn_all_unselect:
                unselect_all();
                break;
                
            //删除
            case R.id.btn_delete:
                delete();
                break;

            //取消
            case R.id.btn_cancel:
                cancel();
                break;
        }
    }

    // 全选
    private void select_all() {
        for (int i = 0; i < mCheckedList.size(); i++) {
            mCheckedList.set(i, true);
        }
        mAdapter.setData(mDataList, mCheckedList);
        mAdapter.notifyDataSetChanged();
    }


    //取消
    private void cancel() {
        for (int i = 0; i < mCheckedList.size(); i++) {
            mCheckedList.set(i, false);
        }
        mAdapter.setData(mDataList, mCheckedList);
        mAdapter.notifyDataSetChanged();

    }

    //删除
    private void delete() {
        for (int i = 0; i < mCheckedList.size(); i++) {
            if (mCheckedList.get(i)) {
                mCheckedList.remove(i);
                mDataList.remove(i);
                i--;
            }
        }
        mAdapter.setData(mDataList, mCheckedList);
        mAdapter.notifyDataSetChanged();
    }

    //反选
    private void unselect_all() {
        for (int i = 0; i < mCheckedList.size(); i++) {
            mCheckedList.set(i, !mCheckedList.get(i));
        }
        mAdapter.setData(mDataList, mCheckedList);
        mAdapter.notifyDataSetChanged();
    }
}

主要是Adapter 的代码,里面解决了ListView 嵌套CheckBox的问题。比如,当选中item中的checkbox时然后上下滑动,这时你会发现item会被复用,什么意思呢?就是当你上下滑动listView时,选中的checkbox会被取消,这个问题跟listview加载图片时会错位一样,都是事件分发机制造成的,具体解决接下来看操作:

package com.example.cx.listviewdemo;

import android.content.Context;
import android.content.SharedPreferences;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;
import java.util.List;


public class MyAdapter extends BaseAdapter {
    private Context mContext;
    private List<String> mDataList;
    private List<Boolean> mCheckedList;
    private SharedPreferences mSp;

    public MyAdapter(Context context, List<String> mDataList) {
        this.mContext = context;
        this.mDataList = mDataList;
        mSp = mContext.getSharedPreferences("config", Context.MODE_PRIVATE);
    }


    //会被多次调用(只要ListView条目个数发生变化的时候)
    public void setData(List<String> dataList, List<Boolean> checkedList) {
        this.mDataList = dataList;
        this.mCheckedList = checkedList;
    }

    @Override
    public int getCount() {
        return mDataList.size();
    }

    @Override
    public Object getItem(int position) {
        return mDataList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }



    //图片错位: 给加载的图片设计tag(url)标记,复用之后再次滑动当前条目,判断当前图片URL和这个Tag标记是否一致,如果一致就显示,如果不一致就不显示

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder = null;
        if (viewHolder == null) {
            viewHolder = new ViewHolder();
            convertView = View.inflate(mContext, R.layout.layout_list_item, null);
            viewHolder.mTv = convertView.findViewById(R.id.item_tv);
            viewHolder.mCb = convertView.findViewById(R.id.item_cb);
            convertView.setTag(viewHolder);

        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        viewHolder.mTv.setText(mDataList.get(position));
        viewHolder.mCb.setChecked(mCheckedList.get(position));

        viewHolder.mCb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                mCheckedList.set(position, isChecked);
                notifyDataSetChanged();
            }
        });

        return convertView;
    }


    public static class ViewHolder {
        TextView mTv;
        CheckBox mCb;
    }
}
这是适配器布局代码:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="60dp"
    android:gravity="center_vertical"
    android:paddingTop="10dp"
    android:paddingBottom="10dp"
    android:descendantFocusability="blocksDescendants" //防止listview与checkbox点击造成冲突
    android:orientation="horizontal">
    
    <TextView
        android:id="@+id/item_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        />
    
    <CheckBox
        android:id="@+id/item_cb"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true" 
        android:layout_centerVertical="true"
        android:layout_marginRight="15dp" />

</RelativeLayout>
这样我们就实现了ListView嵌套Checkbox实现真正的多选、全选、反选、取消。
OpenClaw与Ollama本地AI部署指南 AI模型本地化部署是当前企业数字化转型的关键技术,通过开源框架Ollama可以在消费级硬件上运行大语言模型。本文以OpenClaw多智能体系统为例,详解从环境配置到模型优化的全流程实践,特别针对国内开发者遇到的网络问题提供了镜像加速等解决方案。这种私有化部署方案尤其适合金融数据分析、企业知识管理等对数据安全要求高的场景,通过模块化设计实现多智能体协作,同时保持对NVIDIA显卡和普通CPU的兼容性。 阅读详情

相关推荐

win11本地部署openclaw实操第5集-X11图形化界面搭建,让WSL2“看见”世界

本文介绍了在WSL2中实现图形界面(GUI)的方法。由于WSL2默认没有图形界面,需要使用X11服务器作为"翻译显示器",将Linux程序的图形指令渲染到Windows窗口中。推荐使用VcXsrv作为X11服务器,详细说明了其安装和配置步骤,包括选择"One large window"显示模式、禁用访问控制等关键设置。随后在Ubuntu中安装轻量级xfce4桌面环境,并通过设置DISPLAY环境变量将图形输出指向VcXsrv。最终通过startxfce4命令成功在Vc

weixin_44626085的博客 811

listView + CheckBox的使用

listView + checkbox 使用

qq_34603555的博客 2258

解码运动想象:BCI Competition IV 2a数据集实战指南

本文提供了BCI Competition IV 2a数据集的实战指南,详细解析了该经典运动想象脑电数据集的结构、文件格式与实验范式。通过MNE-Python等工具,逐步演示了从原始信号读取、预处理(通道选择、滤波、分段)到特征提取(CSP、频带功率)和模型训练(LDA、SVM)的完整流程,并强调了受试者独立评估的重要性,为BCI研究者提供了可复现的入门与进阶路径。

weixin_29304985的博客 362

android如何实现ListView中的CheckBox的全选、反选、全不选

转发地址:http://blog.163.com/hjl_love_lx/blog/static/1209689902011723101742679/ 1、全选 for (int index = 0; index LinearLayout layout = (LinearLayout) controlActionView.getChildAt(index); CheckBox check

jiyidehao的博客 509

保姆级教程:用DaVinci Configurator & Developer从零搭建AUTOSAR OS(TC2xx三核实战)

本文提供了一份详细的AUTOSAR OS配置指南,使用DaVinci Configurator和Developer工具从零开始搭建Infineon TC2xx三核系统。涵盖多核配置协同逻辑、版本兼容性陷阱及验证错误的解决方案,帮助开发者在3小时内构建可运行的多核OS框架。

weixin_33940469的博客 313

银河麒麟V10新特性解析:从安装到AI应用的全面指南

本文全面解析银河麒麟V10操作系统的新特性,从安装指南到AI应用开发,详细介绍了其智能调度引擎、神经网络加速和场景化AI工具集等核心功能。通过实战案例展示如何高效配置AI环境、优化性能,并解决常见问题,助力开发者在国产操作系统上实现高效AI开发与应用部署。

seed的博客 299

ListView中Checkbox的使用

      1 Listview item中加入checkbox后onListItemClick 事件无法触发 2 实现点击item则选中checkbox  3 item重用的时候,checkbox选中状态会混乱,需要用另一个容器记录复选框的选中状态   问题1原因: checkbox的优先级高于ListItem于是屏蔽了ListItem的单击事件。 解决:android:fo...

wangzhantao的专栏 332

Unity ECS 之 Entitas 的简单介绍,插件下载、导入,和简单使用(一篇文入门搞懂ECS是什么)

Unity ECS 之 Entitas 的简单介绍,插件下载、导入,和简单使用(一篇文入门搞懂ECS是什么) 目录 Unity ECS 之 Entitas 的简单介绍,插件下载、导入,和简单使用(一篇文入门搞懂ECS是什么) 一、简单介绍 二、一些专有项简介 Entity Context Group Collector Matcher System Feature 三、注意实现 四、ECS 的下载 Github 上下载 Unity Asset Store 中下载 U...

仙魁XAN 7779

android listview 增加单选 复选,ListView里面加入CheckBox如何实现单选?

这个的问题也就是点击的时候 checkbox的选项会乱的问题这个问题的解决很好解决,一个map或者实体类中加个字段就可以搞定。如果想彻底掌握也不麻烦,我这个人不太喜欢贴代码,谈谈原理仅作参考了解listview加载原理和优化原理即可明白怎么做1、listview加载原理listview在适配后不只加载界面上的几个item,也就预加载界面上下相邻的一个item,按照这个规律在滑动后销毁和加载对用it...

weixin_35755823的博客 731

Vue2 - 详细实现安装西瓜视频 xgplayer 插件详细配置及使用教程,利用西瓜视频播放器播放 mp4、flv、hls 格式视频文件及视频推流(直播或监控摄像头画面),支持移动端H5及PC网站!

vue2,nuxt2,西瓜视频,xgplayer,插件组件,xgplayer-hls,xgplayer-flv,xgplayer-mp4,播放视频点播和直播视频流,自定义播放器样式,截屏,监控视频,vue使用西瓜播放器播放flv、hls、mp4视频,截屏按钮,直播流,报错,黑屏,加载失败,苹果ios不兼容,重连,怎么改样式,很卡,详细教程,监控实时播放推流,倍速播放,在线flv在线推流地址,HLS播放,vue西瓜播放器,vue如何使用西瓜视频插件做直播推流回流,视频点播,flv在线视频流播放,截图功能,利用

🏆 前端领域优质创作者 1万+

效果炸裂_安装midscene_copw基于midscene操作电脑_基于视觉的软件测试执行_MIDSCENE的安装和使用---AI大模型应用探索0012

摘要:本文介绍了如何通过安装MidSceneJS来增强Copaw的屏幕操作能力。首先需要安装Node.js和npm,并配置淘宝镜像源加速安装。然后全局安装MidScene CLI工具(npm install @midscene/cli -g)。接着配置视觉大模型服务,通过设置环境变量指定模型API密钥、名称、基础URL和家族类型(如qwen3.5-27b),配置文件需存放在C:\Users\Administrator.copaw目录。安装成功后,MidScene已能成功识别并操作屏幕,使用效果良好。文中还提

添柴程序猿的专栏 638

Android实现ListView嵌套Checkbox真正的多选、全选、反选

Android实现ListView嵌套Checkbox真正的多选、全选、反选我们在开发APP的时候,很多情况下会使用到ListView嵌套CheckBox的情况,其实很多人要说这个其实很简单了,并没有那么复杂,为什么还要单独用一篇博客来写呢?事实上并非如此,我们在使用ListView嵌套CheckBox复选框的时候会出现很多问题,接下来我将用一篇博客来说明这些问题,给大家一些参照,需要代码的朋友可以

事情往往烟消云散 7805

在 Visual Studio Code 中开发 SAP Fiori 应用并部署到 Cloud Foundry 的完整实战指南

摘要:本文介绍如何以ABAP RAP服务为后端,通过VS Code和SAP Fiori工具将Fiori应用一键部署到SAP BTP Cloud Foundry环境。主要内容包括:1) 开发环境配置(VS Code+Fiori工具);2) 架构流程说明(MTA打包、Approuter路由);3) 权限准备(业务Catalog分配);4) 创建带Approuter的MTA项目;5) 连接ABAP OData服务并生成Fiori应用。文中还针对常见问题(如服务不可见、部署失败)提供了解决方案参考。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 364

Android实现ListView嵌套Checkbox真正的多选、全选、反选(附带源码)

Android实现ListView嵌套Checkbox真正的多选、全选、反选(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 1217

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Android CheckBox实现多选、全选、反选功能

CheckBox实现多选、全选、反选功能 前不久项目中用到了多选列表功能,在这里讲述一下实现思路以及需要注意的地方, 不足之处,敬请谅解! 实现多选功能列表一般可以用ListView 或RecyclerView嵌套CheckBox实现,这里用的是ListView。 废话不多,先上图 先说一下多选实现思路 首先需要一个Map集合用于存储每一个条目的选中状态。选中哪个条目,则把...

敲代码的鸟 1万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

android 列表滑动多选,Android实现ListView嵌套Checkbox真正的多选、全选、反选

我们在开发APP的时候,很多情况下会使用到ListView嵌套CheckBox的情况,其实很多人要说这个其实很简单了,并没有那么复杂,为什么还要单独用一篇博客来写呢?事实上并非如此,我们在使用ListView嵌套CheckBox复选框的时候会出现很多问题,废话不多说,直接进入主题,首先我们来看ListView的item的布局文件:listview_item.xmlandroid:layout_wi...

weixin_42134240的博客 1263

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

ListView嵌套CheckBox

在android开发中经常会使用到一些listView中嵌套一些Button,CheckBox等等布局。那么本编重点介绍CheckBox和ListView的使用。其实很简单,在listView的item中添加一个CheckBox就好,这样在每条item中都会出现一个CheckBox。下面就来介绍怎么实现全选,多选等功能。这个其实在你自定义的adapter中记录下被勾选的位置,然后改变CheckB...

WindyMing的博客 3286

5.android listview 里写了CheckBok 点击事件冲突+ListView嵌套CheckBok实现全选,单选,反选,取消,删除的操作

关于listview 里写了CheckBok 点击事件不好用了的问题,原因是焦点传递到了子控件。 导致别的控件没焦点,只有checkbok有。 解决办法是在xml最外层里加一个阻止焦点传递到子控件的代码 &lt;!--阻止焦点向子控件传递    android:descendantFocusability="blocksDescendants"  --&gt;    //ListView嵌套...

曹二少的博客 389

Android在listview添加checkbox实现

主界面CheckBoxinListViewActivity.java代码如下: public class CheckBoxinListViewActivity extends Activity { /** Called when the activity is first created. */ private MyAdapter adapter;

非著名程序员 2387

Listview嵌套CheckBox

public class MainActivity extends Activity { private ListView lv; ArrayList<Map<String, Object>> list=new ArrayList<Map<String,Object>>(); //listview的Textview准备的文本 String[] name={"全选","a

龙杰的博客 513

ListView里面嵌套CheckBox

布局文件 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height...

weixin_30698527的博客 139

Listview嵌套CheckBOX 实现全选反选取消,并对选中项进行标记

项目中遇到类似需求 ,参考前辈代码自己进行整改。直接发码。 Activity中 public class ScreenActivity extends AppCompatActivity implements View.OnClickListener { private static final String TAG = ScreenActivity.class.getSimpleN

qq_16402745的博客 397

android 仿淘宝京东购物车 ListView嵌套CheckBox

MyActivity===========================代码如下 package com.example.ListViewBoxDemo;import android.app.Activity;import android.content.Context;import android.os.Bundle;import android.view.View;import andro...

weixin_30258901的博客 177

Android 防止 ListView 中嵌套 CheckBox 时,CheckBox 选中状态错乱

场景:当ListView中嵌套CheckBox,在滑动过程中,遇到滑动过程中,CheckBox选中状态错乱。分析:ListView在滑动过程中,每个item都需要调用getView(int position, View convertView, ViewGroup parent)方法,而这个方法传入的 convertView 是在屏幕滑动过程中不断复用的,以减少 item 重新创建的内存消耗。但同...

码农Hunter 911

Android中ListView嵌套CheckBox的问题

在Android开发中经常遇到ListView的条目中有CheckBox的问题,在这里为几个常遇到的问题提供一些粗略的解决方法问题一:出现混乱 在开发中ListVeiw的条目中直接加入CheckBox 1.activity_main.xml的布局文件内容<?xml version="1.0" encoding="utf-8"?> <RelativeLayout android:id="@

MyselfGang的博客 684

关于ListView中嵌套CheckBox时,两者点击事件的响应问题

关于ListView中嵌套CheckBox时,两者点击事件的响应问题 由于近期公司项目要新增全选/取消全选功能,而项目之前使用的是ListView+CheckBox方案,并且同时保留了ListView的item的点击事件和CheckBox的点击事件,但在完成全选/取消全选功能之后,点击CheckBox会导致全选框显示的混乱,由此需要屏蔽CheckBox的点击事件。 然而,在网上搜索之后发现并不...

我的世界_你不懂的博客 579
上一篇: Java 让你彻彻底底明白JAVA堆与栈的区别
下一篇: android 实现随机生成图片验证码
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值