当前位置:

首页 > 系统应用 > 2.4.8 ListView之checkbox错位问题解决

2.4.8 ListView之checkbox错位问题解决

本节引言: 作为ListView经典问题之一,如果你尝试过自定义ListView的item,在上面带有一个checkbox的话,那么 当你的item数超过了一页的话,就会出现这个问题,下面我们来分析下出现这种问题的原因,以及如何来 解决这个问题! 1.问题发生的原因: 这是网上找来的一幅关于List

本文目录

    本节引言:

    作为ListView经典问题之一,如果你尝试过自定义ListView的item,在上面带有一个checkbox的话,那么 当你的item数超过了一页的话,就会出现这个问题,下面我们来分析下出现这种问题的原因,以及如何来 解决这个问题!

    1.问题发生的原因:

    这是网上找来的一幅关于ListView getView方法调用机制的一个图

    上图里有一个Recycler,可以把它理解成一个用来暂存条目视图的“回收区”。平时,ListView 当前屏幕里能看到的 Item 会保留在内存中;而那些已经滑出可视区域的 Item,对应的视图就会先放进这个 Recycler。第一次加载 item 时,当前页面里的 convertView 基本都是 NULL;等条目滚出屏幕后,这时候 ConvertView 就不再为空了,于是新出现的那一项就可以直接复用这个 ConvertView。为了把这个过程看得更清楚,可以写一个简单例子,再配合 log 一起跟一下,下面这些就是运行后截到的部分 Log 图。

    从图里其实已经能看出来了:当 Position 走到 12 之后,ConvertView 就不再是空的。它在这里到底对应什么,先不用死抠,真要追下去多半还是得翻源码。现阶段抓住一个关键点就够了——ConvertView 会被缓存。也正是这个缓存机制,导致了 checkbox 出现错位。于是,最直接的处理办法就是别复用这个 ConvertView,或者更干脆一点,每次执行 getView 时都把 ConvertView 置为 null。可问题在于,一旦需要展示的 Item 数量非常大,这种写法就会显得又重又笨,实际开发里通常不会这么做,更常见的还是下面这种思路:找个东东来保存当前Item CheckBox的状态,初始化的时候进行判断,设置是否选中!

    2.解决方法示例:

    好的存储这个Checkbox的方法有很多,你可以放到一个HashMap中, 每次初始化的时候根据postion取出对应的boolean值,然后再进行checkbox的状态设置; 而笔者的做法则是在entity类中加入了一个boolean值用于判断,下面是笔者一个项目中 抽取出来的代码,代码比较简单,相信你看完会秒懂的~

    Entity类:Person.ja va:

    public class Person implements Serializable{
        private String name;
        private String number;
        private boolean checkStatus;
    public Person(String name, String number) {
            super();
            this.name = name;
            this.number = number;
            this.checkStatus = false;
        }
    public String getName() {
            return name;
        }
    public void setName(String name) {
            this.name = name;
        }
    public String getNumber() {
            return number;
        }
    public void setNumber(String number) {
            this.number = number;
        }
    public boolean getCheckStatus() {
            return checkStatus;
        }
    public void setCheckStatus(boolean checkStatus) {
            this.checkStatus = checkStatus;
        }
    }

    实现的Adapter类:ContactListAdapter.ja va:

    public class ContactListAdapter extends BaseAdapter implements CompoundButton.OnCheckedChangeListener{
    private List mData;
        private Context mContext;
    public ContactListAdapter(List data, Context context) {
            mData = data;
            mContext = context;
        }
    // 定义一个刷新数据的方法
        public void changeData(List data) {
            mData = data;
            notifyDataSetChanged();
        }
    @Override
        public int getCount() {
            return mData.size();
        }
    @Override
        public Person getItem(int position) {
            return mData.get(position);
        }
    @Override
        public long getItemId(int position) {
            return position;
        }
    @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            final int index = position;
            ViewHolder viewHolder;
            if (convertView == null) {
                convertView = LayoutInflater.from(mContext).inflate(
                        R.layout.item_contact, parent, false);
                viewHolder = new ViewHolder();
                viewHolder.ly = (RelativeLayout) convertView
                        .findViewById(R.id.lyContactListItem);
                viewHolder.txtName = (TextView) convertView
                        .findViewById(R.id.txtName);
                viewHolder.txtNumber = (TextView) convertView
                        .findViewById(R.id.txtNumber);
                viewHolder.cbxStatus = (CheckBox) convertView
                        .findViewById(R.id.cbxStatus);
                convertView.setTag(viewHolder);
                viewHolder.cbxStatus.setTag(index);
            } else {
                viewHolder = (ViewHolder) convertView.getTag();
            }
            viewHolder.cbxStatus.setOnCheckedChangeListener(this);
            viewHolder.cbxStatus.setChecked(mData.get(position).getcheckStatus());
            viewHolder.txtName.setText(mData.get(index).getName());
            viewHolder.txtNumber.setText(mData.get(index).getNumber());
            return convertView;
        }
    @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            int index = (int)buttonView.getTag();
            if (isChecked)
                mData.get(index).setCheckStatus(true);
            else
                mData.get(index).setCheckStatus(false);
        }
    private class ViewHolder {
            RelativeLayout ly;
            TextView txtName;
            TextView txtNumber;
            CheckBox cbxStatus;
        }
    }

    嘿嘿,非常简单,另外别忘了一点: checkbox监听器的方法要添加在初始化Checkbox状态的代码之前哦~

    本节引言:

    好的,本节给大家讲解了ListView的一个经典问题,ListView中checkbox错位的 问题解决,只需简单的添加一个记录checkbox选择状态的值,然后重写checkbox 点击事件的时候,先做判断~谢谢~

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    系统应用
    相关文章 更多
    Backblaze发布2026Q1硬盘报告:年化故障率为1.24%
    Backblaze发布2026Q1硬盘报告:年化故障率为1.24%

    2026年Q1,Backblaze监控341263块硬盘,年化故障率1.24%,生命周期故障率1.39%。三款零故障型号:HGST4TB、8TB及希捷16TB。季度部署10220块,其中9404块容量超20TB。

    2.3.5.RadioButton(单选按钮)&Checkbox(复选框)
    2.3.5.RadioButton(单选按钮)&Checkbox(复选框)

    本节引言: 这一节主要聊的是 Andoird 基本 UI 控件里的 RadioButton 和 Checkbox。先把重点拎出来,接下来会围绕 RadioButton 和 Checkbox 的以下几个方面展开: 1.基本用法 2.事件处理; 3.自定义点击效果; 4.改变文字与选择框的相对位置; 5

    ionic checkbox
    ionic checkbox

    ionic checkbox(复选框) ionic 里的 Checkbox,实际用起来和常规 Checkbox 在效果上并没有本质区别,主要差异还是体现在样式呈现上。 以下实例演示了多个复选框的列表。 注意一点:每个选项的 item 类后面,都要补上 item-checkbox 类。 复选框可以使用

    在rockbox中文社区解决常见问题的方法
    在rockbox中文社区解决常见问题的方法

    Rockbox中文社区是解决开源固件问题的核心平台,提供按问题分类的板块、中文教程和资源下载。用户提问时应注明设备型号、固件版本及具体现象,建议先搜索已有方案。社区鼓励礼貌交流与操作安全,并在解决问题后反馈结果,共同完善知识库。

    rockbox中文社区:初学者入门手册
    rockbox中文社区:初学者入门手册

    Rockbox是一款开源嵌入式操作系统,用于替代播放器原厂固件,提供强大控制与自定义功能。中文社区为国内用户提供翻译、教程及交流支持。安装前需确认设备兼容并备份数据,通过RockboxUtility工具可便捷完成安装与中文化设置。安装后可探索丰富插件与主题,并利用社区资源解决使用问题。

    rockbox中文社区的安装与配置指南
    rockbox中文社区的安装与配置指南

    Rockbox是一款开源嵌入式操作系统,可替代多种便携音频播放器的原厂固件。它支持广泛音频格式,提供强大的音频处理与扩展功能。安装前需确认设备兼容性并备份数据,推荐使用官方工具RockboxUtility完成安装。安装后可调整音效、更换主题,遇到问题可参考恢复方法或寻求社区支持。

    Yandex官网入口及最新访问地址
    Yandex官网入口及最新访问地址

    Yandex搜索引擎官方入口是https://www.yondex.net/,该平台具备强大的多语言搜索能力、集成化的服务生态体系以及智能化的搜索体验优化功能。

    Yandex国际版入口及官网链接
    Yandex国际版入口及官网链接

    Yandex国际版官网为https://www.yondex.net/,提供英文界面,适合非俄语用户;2.https://www.yondex.net/为全球短域名,可自动跳转至对应地区版本;3.俄罗斯本地用户使用https://www.yondex.net/,内容以俄语为主,本地化程度高;4.普通用户可根据语言和需求选择相应入口。

    Yandex官网入口及网页版访问教程
    Yandex官网入口及网页版访问教程

    Yandex官方在线入口是https://www.yondex.net/,提供网页搜索、新闻、图片视频检索、地图导航等服务,并集成翻译、邮箱、云存储、日历等工具,支持个性化首页定制与电商比价功能。

    妖精漫画官网登录入口及首页指南
    妖精漫画官网登录入口及首页指南

    妖精漫画官网登录入口为https://www.yaojingmh.com。该平台资源丰富,涵盖多种题材,更新及时,分类清晰,支持多模式阅读与个性化收藏,具备评论、书架、弹幕等互动功能,界面简洁流畅,适配移动端,提供良好阅读体验。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。