Android中ListView中有Checkbox时,想获得item的position,以及全选,反选

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

想要获得item的position,其实可以直接settag(position)

全选,反选的话,用一个map集合来存储Checkbox的状态即可

首先要自定义好BaseAdapter
如下:

class myBaseAdapter extends BaseAdapter {

        class ViewHolder {
            private ImageView icon;
            private TextView name_Tv, desc_Tv;
            private CheckBox checkBox;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub

            ViewHolder viewHolder;
            TaskInfo taskInfo;
            if (position == 0) {
                TextView view = new TextView(JinChengGuanLiActivity.this);
                view.setText("用户进程(" + userTaskInfos.size() + ")");
                view.setTextColor(Color.WHITE);
                view.setBackgroundColor(Color.GRAY);
                return view;
            } else if (position == userTaskInfos.size() + 1) {
                TextView view = new TextView(JinChengGuanLiActivity.this);
                view.setText("系统进程(" + systemTaskInfos.size() + ")");
                view.setTextColor(Color.WHITE);
                view.setBackgroundColor(Color.GRAY);
                return view;
            }

            if (convertView != null && convertView instanceof ViewGroup) {
                viewHolder = (ViewHolder) convertView.getTag();
            } else {
                convertView = View.inflate(JinChengGuanLiActivity.this,
                        R.layout.jinchengguanli_listview, null);
                viewHolder = new ViewHolder();
                viewHolder.icon = (ImageView) convertView
                        .findViewById(R.id.jinchengguanli_icon);
                viewHolder.name_Tv = (TextView) convertView
                        .findViewById(R.id.jinchengguanli_name);
                viewHolder.desc_Tv = (TextView) convertView
                        .findViewById(R.id.jinchengguanli_inrom);
                viewHolder.checkBox = (CheckBox) convertView
                        .findViewById(R.id.jinchengguanli_checkbox);
                convertView.setTag(viewHolder);
            }

            if (position <= userTaskInfos.size()) {
                taskInfo = userTaskInfos.get(position - 1);
            } else {
                taskInfo = systemTaskInfos.get(position - userTaskInfos.size()
                        - 2);
            }

            viewHolder.icon.setImageDrawable(taskInfo.getIcon());
            viewHolder.name_Tv.setText(taskInfo.getName());
            viewHolder.desc_Tv.setText("占用内存" + taskInfo.getMemory());
            viewHolder.checkBox.setTag(position);

            viewHolder.checkBox.setChecked(isCheckMap.get(position));

            viewHolder.checkBox
                    .setOnCheckedChangeListener(new OnCheckedChangeListener() {

                        @Override
                        public void onCheckedChanged(CompoundButton buttonView,
                                boolean isChecked) {
                            // TODO Auto-generated method stub
                            int id = (Integer) buttonView.getTag();
                            isCheckMap.put(id, isChecked);
                        }
                    });

            return convertView;
        }

        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return position;
        }

        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return userTaskInfos.size() + systemTaskInfos.size() + 2;
        }
    }

主要看checkbox的监听那部分
并且在之前通过settag()方法把position存入checkbox中

isCheckBox是一个map集合,HashMap<Integer,Boolean>,存放position,isChecked
所以在getView方法中,我直接设置 checkBox.setChecked(isCheckMap.get(position));
viewHolder.checkBox.setChecked(isCheckMap.get(position));

            viewHolder.checkBox
                    .setOnCheckedChangeListener(new OnCheckedChangeListener() {

                        @Override
                        public void onCheckedChanged(CompoundButton buttonView,
                                boolean isChecked) {
                            // TODO Auto-generated method stub
                            int id = (Integer) buttonView.getTag();
                            isCheckMap.put(id, isChecked);
                        }
                    });

什么时候初始化的isCheckBox?
在刚开始的时候,我写了个方法:

private void setCheckBox(boolean isChecked) {
        for (int i = 1; i <= userTaskInfos.size(); i++) {
            isCheckMap.put(i, isChecked);
        }
        for (int j = userTaskInfos.size() + 1; j < userTaskInfos.size()
                + systemTaskInfos.size() + 2; j++) {
            isCheckMap.put(j, isChecked);
        }
    }
我用的是setCheckBox(false),设置初始值都为false

这样设置后,再滚动ListView时就不会消失了

如果还要做全选,反选的话
可以根据isCheckBox集合中储存的key-vale来做对应的操作

全选:就直接
setCheckBox(true);
adapter.notifyDataSetChanged();

反选:

inverse_btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                for (int i = 1; i <= userTaskInfos.size(); i++) {
                    isCheckMap.put(i, !isCheckMap.get(i));
                }
                for (int j = userTaskInfos.size() + 1; j < userTaskInfos.size()
                        + systemTaskInfos.size() + 2; j++) {
                    isCheckMap.put(j, !isCheckMap.get(j));
                }
                adapter.notifyDataSetChanged();
            }
        });
手写Custom Adapter:ListView在2024年高性能实践指南 ListView作为Android原生滚动容器,其核心价值在于极简渲染路径、低内存占用与确定性性能表现。它并非过技术,而是面向固定结构、高敏感场景(如医保结算、政务审批)的轻量级视图映射方案。Custom Adapter通过ViewHolder模式消除findViewById开销、数据契约解耦绑定逻辑、生命周期感知规避BadTokenException,显著提升列表响应速度与稳定性。相比ArrayAdapter的全量刷新陷阱,自定义实现支持精准通知(notifyItemChanged)、复用路径优化及业务 阅读详情

相关推荐

android 捕捉子控件点击,Android ListView 子控件onClick正确获取position的方法

在实际开发中,我们有候不仅需要响应ListView的onItemClick,还需要响应其子控件的点击事件,这个候我们就会发现,由于复用等原因,如果直接在子控件的onClick事件中调用getView()中的position,会出现数据或显示错位的问题,原因就是position的值出现了重复或不准确,解决这个问题的方法是,在adapter每次加载数据的候,为需要点击的控件设置一个tag值,这个...

weixin_32462499的博客 312

关于android.widget.ListView.getCheckedItemPositions() .size()

最近学习android,在书上看到一个实例,当listView上没有东西被中的候,getCheckedItemPositions() .size()得到的值确不是0,以下是代码 Platform 2.2     private void showMulti(){ AlertDialog ad = new AlertDialog.Builder(this).setTitle("择省...

童心未泯 520

android listview获取中项

mListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);   SparseBooleanArray checklist = mListView .getCheckedItemPositions(); String strcheck = ""; for (int i = 0; i < checkli

流苏的专栏 1849

Androidlistview全选、全不获得中条目数据

先说明接下来要实现的ListView+CheckBox支持的功能:     1.  外部点击“编辑”(长按ListView的某一项也可),出现复框;     2.  支持全选、复、全不     3.  支持获取中的数据的信息   下面是mainactivity的xml布局   <LinearLayout xmlns:android="http://schema

Zhangxuexue_的博客 3902

android listview 自定义checkbox,Android通过Adapter获取ListView中的CheckBox内容

前言:获取ListViewCheckBox值的方式多种多样,比如利用setMultiChoiceModeListener这个接口通过监听ListView获取到中值,也可以通过HashMap的键值来记录CheckBox对应位置的中状态从而拿到中值,不过我自己结合网上的情况做了一个比较简单的方法,本人是个小白,也不知道这种方法的的利弊,只是分享出来,大神如果有什么看法请指导,谢谢;原理:...

weixin_39845241的博客 784

Xamarin.Android ListView复用问题的解决办法

1、相信刚开始使用ListView都接触到过,就是比如ListViewitem有一个Button或一个CheckBox,你明明点击按键改变了他的背景图片或者颜色,又或者勾CheckBox,但是你一滑动,发现下面你没操作的item也跟着改变了,然后你再滑动回去,结果原来item上面的操作又变没了,这就是ListViewitem复用产生的问题。 2、我的解决办法是直接继承使用系统的ListActivity类,说明下,继承自ListActivity类将自动创建一个ListView,并公开一个ListAd

tanyi2002的博客 334

ListView中的Button或CheckBox点击处理

ListView的使用过程中,我们经常会用到View的复用机制,来优化应用的性能。也就是说ListViewitem的View存在着复用,刚开始Adapter会创造一个屏幕的item,以后的Item就会复用这最初的Item View,只不过把数据更换了而已。于是这样便会带来一个问题,加入Item上有一些局部事件,比如说ChexkBox,当我们点击的是第一项的候,第一个ItemCheckBoX

做最好的自己,遇见最美好的你 1139

[置顶] android ListView包含Checkbox滑动状态改变

题外话: 在xamarinandroid的开发中基本上所有人都会遇到这个小小的坎,的确有点麻烦,当我也折腾了好一半天,如果你能看到这篇博客,说明你和我当初也是一样的焦灼,如果你解决掉这个小小的坎,那么不要着急,一步一步来。我之前写过一篇Xamarin Android ListView简单的例子,例子入门级别的,Xamarin Android ListView简单用法,你也可以下载这个D...

weixin_30266829的博客 111

解决列表 (ListView GrifView RecyclerView )结合CheckBox实现列表择的的问题

原创文章不得转载  实现思路:由于列表类都是需要重复使用Item布局,所以这里不要监听CheckBox的CheckChange事件,不然问题会变得很复杂。只需要监听列表的单击间,把点击事件 绕过CheckBox传递到Item,步骤1、2的设置就是起到这种效果。CheckBox只是起到显示的作用,它的Check改变监听事件这里不会用到。接着通过监听Item的单击事件设置CheckBox是否

I_can_move_you的专栏 1730

轻松解决listView数据混乱

思路:1.定义成员变量lmap     2.判断convertView==null添加到lmap不为空直接从lmap中取出convertView      MyOrderAdapter .java public class MyOrderAdapter extends BaseAdapter { private Context ac; private ArrayList data;

猿份哥 776

使用ListView应该注意的地方

ListViewItem中含有Button无法响应onItemClick()? 解决办法就是将Button的Focus设置为非默认获取 方法一:将ListViewItem Layout的子控件focusable属性设置为false 方法二(推荐):对Item Layout的根控件android:descendantFocusability="blocksDescendant

lostinai的专栏 756

ListView

AndroidListView这个组件比较常用,但对初学者来说,又比较难掌握,在此分享一下我的使用经验。 ListView是以列表的形式展示数据,这里面有三个要素:数据、视图、适配器。 常用的适配器有三种:ArrayAdapter, SimpleAdapter, SimpleCursorAdapter。 【这种方法仅仅适用于每一个item形式都相同的情况】 其中SimpleAdapter扩

u010211389的专栏 557

Android事件监听机制详解与实践指南

事件监听是Android开发中实现用户交互的核心技术,基于观察者模式构建。当用户操作UI组件,系统通过事件源、监听器和事件对象的三层架构传递事件信息。开发者常用的View.OnClickListener等接口,为按钮点击等操作提供标准化处理方案。在电商应用等高交互场景中,合理使用匿名内部类、接口实现或Lambda表达式等监听方式,能有效提升代码可维护性。同需要注意避免内存泄漏和事件冲突,通过GestureDetector等工具类还能实现复杂手势识别。掌握这些事件处理技巧,是构建流畅Android应用的基

weixin_30279315的博客 261

Android开发实战:基于Eclipse的完整项目构建与核心技能解析

Android应用开发作为移动生态的基石,其核心在于理解四大组件(Activity、Service、BroadcastReceiver、ContentProvider)的协作机制与项目架构设计。从原理层面看,Android系统通过组件化模型管理应用生命周期,而开发者需掌握UI布局、事件处理、数据持久化及网络通信等关键技术模块。这些技能的价值在于能够构建稳定、高效且可维护的移动应用,满足从个人工具到商业平台等多种应用场景的需求。本文以经典的Eclipse开发环境为切入点,通过一个完整的“博学谷”项目实战,系统

weixin_30340617的博客 331

Autojs基础-用户界面(ui)

脚本开发需要有界面与用户进行交互,许多脚本开发语言已经有自己的ui控件的使用方式,比如按键精灵的ui界面设置非常便捷。按键精灵的ui控件的取值和赋值方式都已经封装好了,但是autojs很多候只提供控件,取值和赋值需要自己通过安卓进行封装,甚至需要自己手搓控件功能。以游戏为例,会有各种任务,我们可以根据择的任务运行脚本,最好的就是多框单的方式,这样比较好看。但是,autojs没有让多框单的方式,我们又无法保证用户每次只择一个任务,我们就需要手搓这个功能。

qq_55896432的博客 1827

第二节 QML基础知识:语法、基本元素与属性绑定

当属性值是一个JS 表达式(而非字面量),QML 引擎会记录表达式引用的所有属性,任何一个被引用属性变化,表达式都会重新求值width: 400;height: 50radius: 25x: parent.width / 2 - width / 2 // 引用了 parent.width 和自身 width当 parent.width 变化,x 自动重算 → 圆点始终居中。不需要任何手动刷新代码。

ITOfDragon的博客 187

android 获取listview checkbox择的值

android 获取listview checkbox择的值 androidlistview 内部item的布局包含checkbox控件,会遇到常见的问题:1.checkbox无法择;2.择的checkbox后滑动listview内容checkbox择的值会刷新成原来状态值(即没中);3.listview所有checkbox值之后,只能获取当前可见的c

u010507199的专栏 1万+

自定义ListView item包含checkbox实现单和多

CheckBox本为复框,仍然可以当单框用 自定义ListView item中包含一个textview 和checkbox,checkbox中级别高于item,故在xml中进行屏蔽 单方法:(该方法同样适用于radiobutton) main.xml [html] view plain copy span s

Angus博客 3473

AndroidListView结合CheckBox判断中项

本文主要实现在自定义的ListView布局中加入CheckBox控件,通过判断用户是否CheckBox来对ListView中项进行相应的操作。通过一个Demo来展示该功能,ListView中的某一项,然后点击Button按钮来显示中了哪些项。 [1] 程序结构图如下: 其中Person.java是实体类,MainActivity.java是Activity组件类。...

jandroid 400
下一篇: 获取Android系统正在运行的线程
Ghost_war
博客等级 码龄10年 0粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值