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

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

	@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
Holder 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中的组件数据再初始化为原来的状态就行了。

	@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
Holder 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;
}

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

解决ListView 缓存机制带来的显示不正常问题的更多相关文章

  1. 解决iframe缓存机制导致页面不清除缓存不刷新页面的bug

    在使用iframe时,已有页面嵌套了一个iframe页面,当这个页面提交后再次跳转到本页面时,原本iframe内的页面应该刷新数据的,结果未刷新,需要清除缓存后才刷新. 解决方案: var fresh ...

  2. ListView缓存机制踩过的坑

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

  3. 再次探究Android ListView缓存机制

    概述 虽然现在5.0后Google推出了RecycleView,但在5.0 Lollipop普及前Listview仍会被广泛使用,所以打算再次探究一下Listview的源码,了解一下Listview ...

  4. 解决EFCore缓存机制导致的数据查询错误问题

    如题,在对同一个Context连续进行相同条件的查询时,会触发EFCore的缓存机制,如果这个过程中数据发生了变化,则会出现错误. 例如:有两个Context实例,一个负责查询,一个负责增删改, A_ ...

  5. Android性能优化之ListView缓存机制

    要想优化ListView首先要了解它的工作原理,列表的显示须要三个元素:ListView.Adapter.显示的数据. 这里的Adapter就是用到了适配器模式,无论传入的是什么View在ListVi ...

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

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

  7. 页面静态化3 --- 使用PHP页面缓存机制来完成页面静态化(下)操作一个案例(新闻管理系统)

    案例需求: 使用PHP缓存机制完成新闻管理系统的页面静态化数据库表 ecs_article (新闻表)因为新闻这些信息,并不是对实时性要求高,本身这个新闻比较稳定,内容也比较固定,所以我们考虑: 当第 ...

  8. 进击的Hybrid App,量身定做缓存机制

    引用张图,简单粗俗的解释下 Native App.Web App 和 Hybrid App Navtie App: 使用平台系统提供的原生语言来编写的 App,如果Android用java,ios用o ...

  9. RecyclerView 源码分析(二) —— 缓存机制

    在前一篇文章 RecyclerView 源码分析(一) -- 绘制流程解析 介绍了 RecyclerView 的绘制流程,RecyclerView 通过将绘制流程从 View 中抽取出来,放到 Lay ...

随机推荐

  1. ubuntu 的mysql 安装过程和无法远程的解决方案

    ubuntu 的mysql 安装过程和无法远程的解决方案 安装完mysql-server启动mysqlroot@ubuntu:# /etc/init.d/mysql start (如果这个命令不可以, ...

  2. 3.django连接mysql数据库及安装mysqldb驱动报错解决办法

    1.在setting.py设置连接数据库 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'djang ...

  3. vue自定义事件 子组件把数据传出去

    每个 Vue 实例都实现了事件接口(Events interface),即: 使用 $on(eventName) 监听事件 使用 $emit(eventName) 触发事件 1.使用v-on绑定自定义 ...

  4. 红米1S.线刷

    ZC:遇到问题:“Missmatching image and device”,解决网址:“[2.23][史上最全]MiFlash线刷错误的那些事儿_收藏备用_小米手机4_MIUI论坛.html”(h ...

  5. SQL授权语句(MySQL基本语句)

    看他们网上的,写得都是千篇一律,同时,好多也写得不是很好,下面是我自己总结的有关mysql的使用细节,也是我在学习过程中的一些记录吧,希望对你有点帮助,后面有关存储过程等相关操作还没有总结好,下次总结 ...

  6. Jedis源代码探索

    [连接池实现] [一致性hash实现]   [Redis客户端-Jedis源代码探索][http://blog.sina.com.cn/s/blog_6bc4401501018bgh.html]   ...

  7. PHP的mail()函数可以实现直接用脚本发送邮件

    PHP的mail()函数可以实现直接用脚本发送邮件. 用mail()函数发送邮件之前,首先需要在php.ini文件里面设置一下邮件服务属性,主要的设置选项如下: 属性 缺省值 说明 Changeabl ...

  8. 打印控件Lodop

    官网:http://www.lodop.net/demo.html Lodop.C-Lodop使用说明及样例   Lodop(标音:劳道谱,俗称:露肚皮)是专业WEB控件,用它既可裁剪输出页面内容,又 ...

  9. 如何学习html画布呢(canvas)

    我列出了canvas教学资源 http://www.gbtags.com/gb/gbliblist/1.htm  这是极客标签(不是极客学院) http://study.163.com/course/ ...

  10. Idea_学习_09_Idea 方法自动生成参数默认名

    一.方法 1.快捷键 生成方法后,还空着参数,可以使用 ctrl + alt + 空格 ,列出参数,然后选择参数即可. 2.使用插件 二.参考资料 1.Intellij Idea 方法自动生成参数默认 ...