Listview 异步加载图片 快速滑动发生图片错误的解决办法 复用convertview

参考 http://www.3lian.com/edu/2013/08-03/86585.html

说明了复用convertview的后果,并给出了解决办法。通过给imageview设置tag,在线程更新时判断tag来觉得是否显示图片。

但这样并不能解决问题,因为快速滑动后convertview 会把之前position的那个完全复制过来,所以要想显示图片不错位,只要先隐藏imageview就行了。

@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			ViewHolder holder = null;
			if (convertView == null) {
				convertView = inflate.inflate(R.layout.note_list_item, parent,
						false);
				holder = new ViewHolder();
				holder.img = (ImageView) convertView
						.findViewById(R.id.note_listitem_img);
				convertView.setTag(holder);
			} else {
				holder = (ViewHolder) convertView.getTag();
			}
			holder.img.setVisibility(View.INVISIBLE);
			holder.position = position;
			...
			holder.img.setTag(Integer.valueOf(position));
			String path = nr.imgpath;
			if (path != null && (!path.equals("null"))) {
				LayoutParams param = holder.titleAndContent.getLayoutParams();
				// Log.d("param", "param.width = " + param.width);
				param.width = 500;
				// img.setVisibility(View.INVISIBLE);
				if (listitem_imgs.get(position) == null) {
					// Log.d("test", "" + position + " excute task");
					new LoadSingleImageTask(position, path, holder.img)
							.execute();
				} else {
					// Log.d("test", "position "+position+" not async show");
					ListItemImg item = listitem_imgs.get(position);
					if (item.bm != null) {
						holder.img.setImageBitmap(item.bm);
						holder.img.setVisibility(View.VISIBLE);
					}
				}

			} else {

				LayoutParams param0 = holder.img.getLayoutParams();
				holder.img.setVisibility(View.GONE);
				LayoutParams param1 = holder.titleAndContent.getLayoutParams();
				// Log.d("param", "param.width = " + param.width);
				param1.width = 500 + param0.width;
				// img.setLayoutParams(null);
			}


这样刚加载到converview就会把之前的imageview的内容隐藏掉,而真正的内容在加载后再把imageview 显示出来。


亲测这样就不会显示之前position的图片了,但是用asynctask做异步效果不是很好,以后可以用线程池试下后再得出结论。


至于不复用convertview 会出现bug ,图片可能会显示不全。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值