ListView加载数据原理:系统绘制ListView时,首先会用getCount()函数得到要绘制的这个列表的长度,然后开始逐行绘制。然后调用getView()函数,在这个函数里面首先获得一个View(简单item,如字符串或者单个组件的显示则是View,自定义的item,包含很多控件的时候是一个ViewGroup),然后再实例化并设置各个组件及其数据内容并显示它。如果我们有大量的item要显示怎么办?不可能为每个Item创建一个新的View,这会消耗大量的内存,可能会OOM!解决办法就是缓存View然后重复利用。这个图是解释了系统缓存的过程,当有前面的Item已经划出屏幕时,它的View将被后面的Item复用。

显示不正常问题:缓存机制固然很好,但在使用时要特别注意。比如,前面的Item里面的组件的数据也会被带到将要复用的Item中,从而导致显示错误。

    @Overridepublic View getView(int position, View convertView, ViewGroup parent) {// TODO Auto-generated method stubHolder holder = null;convertView = null; //禁用缓存机制if (convertView == null) {convertView = mInflater.inflate(R.layout.bus_unit, parent, false);holder = new Holder();holder.station = (TextView) convertView.findViewById(R.id.textView_station);

解决办法:最简单的方法就是禁用它的缓存机制,这只适用于Item比较少的情况。

对于Item比较多的情况,这样的解决办法显然是不合适的。另外一种解决办法其实也挺简单的,只要将Item中的组件数据再初始化为原来的状态就行了。

   @Overridepublic View getView(int position, View convertView, ViewGroup parent) {// TODO Auto-generated method stubHolder holder = null;if (convertView == null) {convertView = mInflater.inflate(R.layout.bus_unit, parent, false);holder = new Holder();holder.station = (TextView) convertView.findViewById(R.id.textView_station);holder.stationState = (ImageView) convertView.findViewById(R.id.imageView_station_state);convertView.setTag(holder);} else {holder = (Holder) convertView.getTag();}//应对缓存机制,初始化数据。holder.stationState.setImageResource(R.drawable.presence_offline);holder.station.setText(bean.getBusList().get(position));if (bean.getBusList().get(position).equals(bean.getCurrentPosition())) {String text = bean.isDirection() ? "当前位置" : "目标位置";holder.stationState.setImageResource(R.drawable.presence_now);}String station;int index2 = bean.getBusList().get(position).indexOf("(");if (index2 != -1) {station = bean.getBusList().get(position).substring(0, index2);} else {station = bean.getBusList().get(position);}if (bean.getStationList().contains(station)) {if (bean.getStateList().get(index).equals("前往")) {holder.stationState.setImageResource(R.drawable.presence_online);}}return convertView;}

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/AndyDai/p/4734099.html

解决ListView 缓存机制带来的显示不正常问题相关推荐

  1. ListView缓存机制小结

    文章目录 ListView缓存机制小结 前言 概述 layout过程 第一次Layout 第二次Layout 滑动事件 参考资料 ListView缓存机制小结 前言 由于本人水平有限,如果文章中出现一 ...

  2. ListView缓存机制踩过的坑

    ListView,GrildView使用时候经常会用到缓存机制,随意一搜,例子成千上万,但是讲解都是很一致,跟自己踩的坑很少有人讲解到. 测试 需求: GrildView 分三列显示,默认背景为白色, ...

  3. Android笔记(二十五) ListView的缓存机制与BaseAdapter

    之前接触了ListView和Adapter,Adapter将数据源和View连接起来,实际应用中,我们要显示的数据往往有很多,而屏幕只有那么大,系统只能屏幕所能显示的内容,当我们滑动屏幕,会将旧的内容 ...

  4. 清除浏览器缓存之后为什么还是显示旧的html页面_H5缓存机制浅析-移动端Web加载性能优化...

    1 H5缓存机制介绍 H5,即HTML5,是新一代的HTML标准,加入很多新的特性.离线存储(也可称为缓存机制)是其中一个非常重要的特性.H5引入的离线存储,这意味着 web 应用可进行缓存,并可在没 ...

  5. ListView和GridView的缓存机制及measure过程

    目录 前言 1.View的Transient状态 2.RecycleBin 3.obtainView 4.getView的调用 5.GridView的onMeasure 6.ListView的onMe ...

  6. 【腾讯Bugly干货分享】Android ListView与RecyclerView对比浅析--缓存机制

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/5811d... 作者:黄宁源 一,背景 RecyclerView是谷歌官方出的一 ...

  7. delphi listview 添加数据 慢_ListView 的缓存机制

    一.前言 ListView 作为一个 Android 5.x 之前的一个用于显示数据列表的控件,或许在今天都已经被 RecyclerView 完全替代,但是其中的缓存机制仍然值得我们去了解,对后面学习 ...

  8. android listview 缓存,探究Android ListView 的缓存机制

    概述 ListView 是继承AbListView,AbListView是所有列表类控件的基类. ListView的数据加载 在ListView数据加载中最关键的一个函数就是makeAndAddVie ...

  9. Picasso之图片缓存机制二ListView篇

    前面已经个大家介绍Picasso图片缓存机制,大家不熟悉请看上一篇文章http://blog.csdn.net/qq_15950325/article/details/52809380,其实Picas ...

最新文章

  1. 激光雷达 win10
  2. Resources about Rx(Reactive Extensions)
  3. 浅谈List保存的数据是引用数据类型的地址
  4. 把SAP云平台上创建的API proxy添加到API product里去
  5. 新年春节项目海报设计,PSD分层模板,帮你顺利交稿!
  6. mysql 9 5.5.29_在CentOS 6.3中安装与配置Mysql-5.5.29的方法
  7. 你知道关闭页面时怎么向后台发送消息吗?
  8. WIN7下java环境的搭建
  9. read()/write()的生命旅程——前言与目录
  10. 创新驱动 | 悬镜安全持续入选《CCSIP 2021中国网络安全产业全景图》
  11. 视频中的字幕如何提取为文本
  12. revit二次开发-创建组
  13. Air202学习 三 (模块串口使用)
  14. [系统安全] 二十五.WannaCry勒索病毒分析 (1)Python复现永恒之蓝漏洞实现勒索加密
  15. 甘特图:有效的项目管理计划怎么制定?
  16. 怎么进入云计算这个行业?新手怎么学习云计算?
  17. 实训报告万能模板计算机专业,计算机专业实习报告模板
  18. openwrt 透明代理上网
  19. 华为开发者联盟上架应用 完结
  20. C#---百度图像识别SDK的控制台简单应用;

热门文章

  1. [react] 简要描述下你知道的react工作原理是什么?
  2. 前端学习(3219):...扩展
  3. 前端学习(3016):vue+element今日头条管理--总结
  4. 前端学习(2966):上午回顾
  5. [css] 请使用CSS画一个带锯齿形边框圆圈
  6. [css] 为什么说css的选择器是从右向左匹配?
  7. 工作294:for[item.key]使用
  8. 工作108:vue里面wangEdit编辑器使用
  9. 前端学习(2520):环境搭建
  10. 前端学习(2477):封装数据接口