解决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,一经查实,立即删除!

相关文章

Java里面static, final, this, super, 代码块, 单例模式

static关键字 package csdn;public class staticWord {public static void main(String[] args) {funStatic fs1 new funStatic();funStatic.showA();fs1.b 2;fs1.showB(); // 2System.out.println("----------");funStatic fs2 new funStatic();funStatic.a 3…

1063. 计算谱半径(20)

1063. 计算谱半径(20) 时间限制200 ms内存限制65536 kB代码长度限制8000 B判题程序Standard作者CHEN, Yue在数学中,矩阵的“谱半径”是指其特征值的模集合的上确界。换言之,对于给定的n个复数空间的特征值{a1b1i, ..., anbni},它们的模为实部…

用了vscode和clion我都裂开了

vscode看着挺牛逼,经常遇到问题,每次运行还得f5调试,你如果想便捷一点,你可以去下插件,比如ccmopiler,code runner啥的。我自己用c但是这两个玩意都不支持c11想要支持还得自己配你看4S店上很多文章&#xf…

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;…

1064. 朋友数(20)

1064. 朋友数(20) 时间限制400 ms内存限制65536 kB代码长度限制8000 B判题程序Standard作者CHEN, Yue如果两个整数各位数字的和是一样的&#xff0c;则被称为是“朋友数”&#xff0c;而那个公共的和就是它们的“朋友证号”。例如123和51就是朋友数&#xff0c;因为123 51 6&…

Java StringBuffer

最近在学Java API 做的简单笔记 package C12_17;public class testBuffer {public static void main(String[] args) {//StringBuffer 属于java.lang包&#xff0c;属于基础包&#xff0c;jdk api 里面有其运用方式。StringBuffer sb new StringBuffer("Hello");//…

XDOJ 363 输出快速排序递归算法隐含递归树的后序遍历序列 AC

像我这样的菜鸡也没有什么能输出的&#xff0c;好像我写题解也不算输出。 最近期末了&#xff0c;写数据结构实验的时候&#xff0c;这个题写了挺久的&#xff0c;搞出来记录一下。 输出快速排序递归算法隐含递归树的后序遍历序列 描述&#xff1a; 快速排序递归算法隐含一棵由…

uilabel 自适应

有时一个UILable的text内容是变化的&#xff0c;而且差异有很大&#xff0c; 需求上要求UILabel的大小高宽能够自适应text的内容。代码例子&#xff1a; myLable[[UILabel alloc] initWithFrame:CGRectMake(0, 23, 175, 33)]; [myLable setFont:[UIFont fontWithName:&qu…

1065. 单身狗(25)

1065. 单身狗(25) 时间限制300 ms内存限制65536 kB代码长度限制8000 B判题程序Standard作者CHEN, Yue“单身狗”是中文对于单身人士的一种爱称。本题请你从上万人的大型派对中找出落单的客人&#xff0c;以便给予特殊关爱。 输入格式&#xff1a; 输入第一行给出一个正整数N&am…

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…

期末寒假绝对好好学

期末考试考7门&#xff0c;距离最近的一门还有7天&#xff0c;我保证我这几天绝对好好复习&#xff0c;好好过一个寒假。我的寒假从来都是浪完的&#xff0c;我发誓我这一次绝对好好学习٩( •̀㉨•́ )و &#xff0c;我不好好学&#xff0c;我这辈子都单身

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不再接 收,并且…

1067. 试密码(20)

1067. 试密码(20) 时间限制400 ms内存限制65536 kB代码长度限制8000 B判题程序Standard作者CHEN, Yue当你试图登录某个系统却忘了密码时&#xff0c;系统一般只会允许你尝试有限多次&#xff0c;当超出允许次数时&#xff0c;账号就会被锁死。本题就请你实现这个小功能。 输入格…

Map接口的实现类HashMap的操作

3中遍历HashMap方式 package C12_21;import java.util.Collection; import java.util.HashMap; import java.util.Set; import java.util.Map.Entry;public class testHashMap {public static void main(String[] args) {//定义两个HashMap 集合HashMap<Integer, Integer&g…

1068. 万绿丛中一点红(20)

1068. 万绿丛中一点红(20) 时间限制500 ms内存限制65536 kB代码长度限制8000 B判题程序Standard作者CHEN, Yue对于计算机而言&#xff0c;颜色不过是像素点对应的一个24位的数值。现给定一幅分辨率为MxN的画&#xff0c;要求你找出万绿丛中的一点红&#xff0c;即有独一无二颜色…

MapReduce 作业调试

1. 最经典的方法通过打印语句来调试程序 System.err.println("Bad Data"value.toString()); 这些输出错误都会记录到一个标准错误中&#xff0c;可以通过WebUI进行查看 2.可以创建一个自定义计数器来统计整个数据集中不合理的数据的数量。 首先创建一个enum enum BA…

寻找边界值,二分模板,简洁凝练

二分模板 class Solution {public static void main(String[] args) {int[] arr{1,2,2,2,2,4,5,6};int l0,rarr.length-1;while(l<r){int midl(r-l)/2;if(arr[mid]>2) rmid;else lmid1;}System.out.println("l:"l"r:"r);System.out.println("le…

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…