解决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中,从而导致显示错误。

	@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;
	}

	

 


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

 

转载于:https://www.cnblogs.com/AndyDai/p/4734099.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值