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

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

显示不正常问题:缓存机制固然很好,但在使用时要特别注意。比如,前面的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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/421149.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows phone (12) 小试自定义样式

windows phone (12) 小试自定义样式 原文:windows phone (12) 小试自定义样式样式在BS开发中经常用到,在wp中系统也提供了解决办法,就是对设置的样式的一种资源共享,首先是共享资源的位置,它是在App类中,之前我们已经有…

xdoj判断堆栈出栈序列是否有效c++

我在leetcode上写过类似的题&#xff0c;这个代码在xdoj上只能得***50***分&#xff0c;跪求各位大佬挑挑毛病。 #include<stack> #include<iostream> #include<vector> using namespace std; int main(){vector<int>poped;stack<int>s;int n,t;…

ArrayList的remove方法(重写equals方法) 与LinkedList的常用操作

package C12_18;import java.util.ArrayList;public class joy {public static void main(String[] args) {show();//重写equals方法&#xff0c;移除集合里面的元素。public static void show() {ArrayList<dog> al new ArrayList<dog>();al.add(new dog("j…

android学习日记13--数据存储之ContentProvide

3、ContentProvider  数据在Android当中是私有的&#xff0c;当然这些数据包括文件数据和数据库数据以及一些其他类型的数据。ContentProvider实现多应用程序间的数据共享类一般利用ContentProvider为需要共享的数据定义一个URI(统一资源定位符)然后其他程序通过Context获得C…

cin,cin.get(),getline()

我势必扫清我对c的各种疑惑&#xff0c;重拾csdn水文之任 结论&#xff1a;cin在获得需要接受的东西之前&#xff0c;对缓冲区里的空格和换行符不会理睬(但是会把它们从缓冲区删去)&#xff0c;但如果达到了可以结束接受的时候&#xff0c;空格和换行符都会让cin不再接 收,并且…

Java 字节和字符流的读写+Buffered

一个关于IO流的导图 IO流字节的读写&#xff0c;实现复制 import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException;public class TestCopy {public static void main(String[] args) throws IOException {copyT…

1070. 结绳(25)

1070. 结绳(25) 时间限制200 ms内存限制65536 kB代码长度限制8000 B判题程序Standard作者CHEN, Yue给定一段一段的绳子&#xff0c;你需要把它们串成一条绳。每次串连的时候&#xff0c;是把两段绳子对折&#xff0c;再如下图所示套接在一起。这样得到的绳子又被当成是另一段绳…

Java预编译和批处理

预编译 package csdn.prepare.take;import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException;public class TestCompiling {public static void main(String[] args) {prep…

Java模拟事务Demo

Java操作Oracle事务&#xff0c;以转账为例。 转账之前 package translate.commit;import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException;public class CommitRollback…

设计模式4-创建型模式-Prototype模式

意图&#xff1a;用原型实例指定创建对象的种类&#xff0c;并且通过拷贝这些原型对象创建新的对象。 原型模式的结构比较简单&#xff0c;在使用C实现该模式时重点要注意deep copy和shallow copy的问题。prototype模式在实际使用的过程中&#xff0c;可以通过增加一个原型管理…

Android--通知之Notification

前言 之前一篇博客讲了Android下使用Toast的方式提示消息。这篇博客讲解一下在Android中使用Notification提示消息给用户&#xff0c;Notification是一种具有全局效果的通知&#xff0c;程序一般通过NotificationManager服务来发送Notification。在本篇博客中&#xff0c;将介绍…

UDP协议下的DatagramSocket和DatagramPacket

1&#xff0c;UDP协议? 面向无连接&#xff0c;数据不安全&#xff0c;但速度快。不区分客户端与服务端。 2&#xff0c;实现通信&#xff1f; (三个达到) IP 简单说就是你电脑地址。端口 你电脑里面软件的地址。协议 如何进行通讯。 DatagramSocket 用来发送和接收数据报包的…

使用Log4J监控系统日志邮件警报

使用Log4J监控系统日志邮件警报 前言 在系统上线后&#xff0c;有时候遇到系统故障&#xff0c;这时候就可以登录服务器查看系统日志来排查问题。但是需要登录服务器&#xff0c;下载查找相关异常日志比较麻烦。而且没有监控的话&#xff0c;也无法实时了解到系统是否正常运行。…

TCP协议下 Socket 与 ServerSocket

不多bb. package c_20_1_5;import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socke…

Autodesk的照片建模云服务—Autodesk ReCap 360 photo

现实捕捉技术方兴未艾&#xff0c;简单的讲现实捕捉技术就是把现实中的现状信息数字化到计算机中以便做进一步的处理。对于不同的应用目的会有不同的捕捉设备&#xff0c;工程或传媒娱乐行业中经常用到的肯定就是三维模型了。那如何得到三维模型呢&#xff1f;我们有多种途径和…

Java多线程,锁(synchronize),饿汉式单例线程,等待处理机制

一&#xff0c;礼让和守护线程 package com.much.hard;public class TestYieldProtect {public static void main(String[] args) {Yield1 y1 new Yield1();y1.setName("A");Yield2 y2 new Yield2();y2.setName("B");//y1.start();//y2.start();Daemon1…

升级ADT22.6后,Android模拟器无法创建

这 两天&#xff0c;在社区里看到有小伙伴们反应&#xff0c;自己在Eclipse下无法创建Android模拟器的问题。起初&#xff0c;自己也没太在意&#xff0c;我一直使用的是 Genymotion模拟器。然后&#xff0c;问题不解决&#xff0c;总有那么一天会让自己碰到的。这不&#xff0…

原来js的parseInt函数还可以这样用

QQpc端登录账号还可以这样玩&#xff01;&#xff01;&#xff01; 图片上来。 wow&#xff0c;我惊呆了。 居然可以登录进出&#xff1f;&#xff01; 都知道&#xff0c;登录会验证账号是整数&#xff0c;文本框输入的是字符串&#xff0c;会把字符串转成整数&#xff0c; 而…