解决ListView 缓存机制带来的显示不正常问题
来源:互联网 发布:aws ubuntu 图形界面 编辑:程序博客网 时间:2024/05/01 18:15
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;}
0 0
- 解决ListView 缓存机制带来的显示不正常问题
- 解决ListView中嵌套的GridView显示不正常的问题
- 解决IE8显示不正常的问题
- 巧用WM_PAINT解决ListView控件嵌入Edit显示不正常的问题
- Android 解决ListView嵌套GridView、GridView显示不正常的方法
- Scrollview嵌套listView数据显示不正常问题
- 关于VNC显示不正常的问题的解决
- 解决HTML文件图标显示不正常的问题
- 解决win7下面图标显示不正常的问题
- 解决Scrollview 嵌套recyclerview不能显示,高度不正常的问题
- 解决ScrollView中嵌套Gridview显示不正常的问题
- 解决office word图片显示不正常问题
- 63ScrollView嵌套ListView带来的问题以及解决方式
- ScrollView嵌套ListView带来的问题以及解决方式
- php 解决文件状态缓存带来的问题
- javascript中ajax框架及解决缓存带来的问题
- 解决 ScrollView和ListView连用时的滑动冲突和显示不正常
- listview的缓存机制
- struts2.1.6的bug之空指针(与tomcat安装)
- ajax获取WordPress边栏信息(二)
- 临时 保存
- 软件开发项目平台搭建
- PostgreSQL数据库日常维护两个要点
- 解决ListView 缓存机制带来的显示不正常问题
- Angie’s List:看老时代的做法如何让120万会员愿意付费
- 坑爹的数据库名
- apache2.0x 开启gzip压缩和http缓存的配置方法
- postgresql之vacuum
- apache下实现301永久性重定向的方法
- ch上两次比赛的简单总结
- sql server安装
- Oracle中sql*plus登录问题