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. BM算法的shift1表是在所有情况下移动都是最快的吗?
  2. 入职三天,公司给了100块钱叫我走人
  3. servlet和servlet-mapping的作用------转载于《简书》作者:简单的书写点
  4. NYOJ 643 发短信
  5. 大量数据生成excel时候造成jvm内存泄漏问题的解决与测
  6. IIC通信---EEPROM24C02---STMF4
  7. 深度学习目标检测之 YOLO v4
  8. 怎么知道自己是否适合计算机专业,事实:我怎么知道我的旧计算机是否适合win7或win10?...
  9. SOTIF - 汽车感知系统验证和确认
  10. 大话Synchronized及锁升级
  11. 少数人知道的公式+思路,财务报表自动生成,财务总监用了5年
  12. hiprint使用初体验,模板设计经验分享
  13. 【数论】蓝桥20:数列求值
  14. 解决resetFields报错 underfined
  15. 制定to-do list的艺术
  16. FPGA开发工具套餐搭配推荐及软件链接 (更新于2020.03.16)
  17. static inline声明
  18. 王半仙儿的日记-0003
  19. kindle所支持的格式
  20. 小记 百度地图 soso地图 经纬度偏移

热门文章

  1. project下查看那些文件夹是空的
  2. 前端学习(3254):react中todolist制作静态组件
  3. 前端学习(2925):vue改变样式1
  4. [html] 说说你对cookie和session的理解
  5. 工作283:从字典表获取数值
  6. 前端学习(2607):vue指令
  7. “约见”面试官系列之常见面试题之第九十二篇之created和mounted区别(建议收藏)
  8. “约见”面试官系列之常见面试题之第四十九篇之ie6bug的解决办法(建议收藏)
  9. 前端学习(1994)vue之电商管理系统电商系统之通过编程导航跳转到商品导航界面
  10. 前端学习(1938)vue之电商管理系统电商系统之下拉框环境