对于listview的性能优化想必大家并不陌生:使用ViewHolder来缓存布局信息,同时利用convertView.setTag(holder)来关联view与holder,正常情况下没有问题,但如果条目中有checkbox,toggleButton之类的控件或者字体颜色需要随着这些控件状态改变而做出改变时,我们会发现上下滑动时会出现控件状态或字体颜色错乱的情况,如下图:

这是什么原因造成的呢?细心的同学应该通过上图发现了一点点的规律,对!他们的位置间隔好像是一定的,其实如果你理解了viewholder和view是怎么关联的,就很容易理解出现这种情况的原因,我简单的解释一下:当convertView.setTag(holder)后其实是将holder中所有的控件都关联到相对应的view中,这其中当然包括了控件的状态,而我们通常的做法只是将状态改变的值赋值给该控件,而不是具体到哪一个条目的控件,所以会出现上面这种控件状态也被复用的情况.

final Alarm alarm = list.get(position);
mHolder.toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {mHolder.time.setSelected(isChecked);mHolder.toggle.setChecked(isChecked);}});mHolder.time.setText(alarm.getHour()+":"+alarm.getMinute());

解决办法很简单,就是将状态值赋给具体的条目,也就是我们需要一个对象来保存每个条目的信息,以Demo中的闹钟为例,每个条目对应一条闹钟信息,我只需要在闹钟对象Alarm中增加一个判断状态的布尔值isOpen,同时在点击开关状态改变时通过get()和set()方法将item中的状态值赋值给具体的条目即可:

final Alarm alarm = list.get(position);mHolder.toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {alarm.setOpen(isChecked);mHolder.time.setSelected(alarm.isOpen());}});mHolder.time.setText(alarm.getHour()+":"+alarm.getMinute());mHolder.toggle.setChecked(alarm.isOpen());

效果如下图:

源码请自行下载: Demo源码

解决listview条目错乱问题相关推荐

  1. Android旋转切换条目,Android:当我添加动态新的ListView条目时,ListView中的旋转器会丢失它们的值...

    我的活动包含一个按钮和一个ListView. ListView包含Spinner和EditText视图.每次我想在Activity的ListView中插入一个新的行条目时,我都会使用该按钮. 我遵循了 ...

  2. android 解决listview.notifyDataSetChanged刷新时Imageloader加载图片闪烁问题

    今天,简单讲讲android里再listview调用notifyDataSetChanged刷新界面时,Imageloader加载图片会闪烁的问题. 最近,发现app里的listview图片会出现闪烁 ...

  3. Android开发之解决ListView和ScrollView滑动冲突的方法

    我们看下图: 不管怎么滑动都无法显示listview的剩余数据,只能显示一条,我们看下布局,ScrollView里面嵌套ListView <?xml version="1.0" ...

  4. android点赞刷新列表图片闪烁,RecyclerView使用——有效解决刷新数据错乱,图片闪烁,OOM问题...

    做项目时,用到RecyclerView去加载1w张图片,为了防止OOM,需要进行分页预加载;这些完成后测试发现刷新recyclerView会造成数据错乱,在查阅资料得到一下的解决方法. 根据网上资料: ...

  5. Android:复杂listview条目

    复杂listview条目 目录 复杂listview条目 一.项目目录结构 二.类:MainActivity 三.类:MyOpenSqlite 四.类:Person 五.activity_main.x ...

  6. 解决ListView显示不全、滑动冲突问题

        在开发中,ListView是使用得最多的控件,有时候会遇到ListView因为各种原因引起的数据显示不全,例如,嵌套了ScrollView等.这个解决的办法很多,这里记录一下我自己用过的方法, ...

  7. 笔记本电脑键盘输入错误如何解决 电脑按键错乱的解决方法步骤

    笔记本电脑键盘输入错误如何解决 电脑按键错乱的解决方法步骤 我们的生活中越来越离不开电脑,但在使用电脑的过程中总会遇到各种各样的问题.知识屋致力于给电脑小白朋友们介绍一些简单常用问题的解决方法,这次给 ...

  8. 让Qt程序适配高分辨率屏幕,解决软件界面错乱异常

    让Qt程序适配高分辨率屏幕,解决软件界面错乱异常 一.问题 二.原因 三.解决方案 1.更改显示器分辨率或者不使用缩放 2.使用"高DIP缩放替代" 3.修改软件,使之自动适配 a ...

  9. 实现listview条目点击显示和隐藏

    ##实现listview条目点击显示和隐藏 -主要修改适配器的getView方法 声明int类型 clickPosition //记录点击的条目position public int clickPos ...

最新文章

  1. Oracle Database 10g:删除表
  2. 【机器学习入门笔记8:TensorFlow运算实质】20190216
  3. 读博熬不住了,拿个硕士学位投身业界如何?看过来人怎么说
  4. android四个按钮平分,android 水平平分两个按钮
  5. ID3和C4.5分类决策树算法 - 数据挖掘算法(7)
  6. 看,这就是你脱下谷歌眼镜的世界——多乏味!
  7. 固态函数不正确_一文解读quot;固态电容quot;的利与弊
  8. Kafka 源码分析之网络层(二)
  9. Codeforces 853C - Boredom
  10. [CTO札记]好部下的3个层次
  11. java d long_java 中long型数据的对比
  12. 一封 Cloud Native 的来信……
  13. 20.10-20.15 shell:for,while循环,break,continue,exit
  14. 调用iphone客户端进行授权发微博的方法--使用友盟组件
  15. 190226每日一句
  16. 数学建模之案例学习1——企业营销额问题
  17. 群晖nas介绍文档_我的NAS我的地盘 篇三:群晖NAS软件介绍与应用之DS file篇
  18. 零成本赚钱小项目,轻松操作,完整版笔记分享给你
  19. html设置文字超过字数_CSS限制字数,超出部份显示点点点...
  20. [Example构造方法增加notNull参数,默认false,允许值为null,值为null的时候不加入到条件中

热门文章

  1. Android国际化多语言切换
  2. Codeforces Round #838 (Div. 2)题解
  3. 2021软科计算机科学与技术,2021软科排名,NTU 十学科跻身世界前十!
  4. 开发团队建设与管理的一些心得
  5. 将查询好的快递单号以及物流导出EXCEL表格
  6. 计算机组成原理——微程序实验
  7. 线上支付对接(支付宝篇)
  8. fiddler抓手机端的包(苹果手机)
  9. 湖南方言之王——湘乡话
  10. STM32通过IIC读取BH1750光照数据