解决listview加载网络图片乱跳

为什么会出现图片乱跳?

使用convertView对ListView的每个item优化,item的复用可以有效降低内存的占用,使ListView滑动更为流畅。但会带来一个问题,当最顶部的item滑出屏幕时,会变成下一个从底部将要滑进来的item。每次滑进来的item都要去请求网络获得图片。

第一个item滑出去时,是带着图片的。其ImageView指向了一块内存。当其慢慢滑出,从底部慢慢滑进时,底部的item与顶部(只有一半在屏幕里能看到了)的还是指向

同一块内存。加载的了同一张图片。

但是底部的item只要一滑进来,就开始请求网络,要获取图片了。当底部item获取图片成功会将原有的图片覆盖。

当每个item都是这样的执行逻辑,整个item就会变得很乱,图片乱闪。

如何解决?

解决这个问题有两个思路:

一个是为在item复用时,检查ImageView上是否为空,如果不为空(有图片),则

viewHolder.imageview.setVisiable(View.GONE);

然后这个item会继续执行请求网络图片,当请求下来的图片不为空(请求成功,并且设置成功),此时在viewHolder.imageview.setVisiable(View.VISIABLE);

下面是第二种思路的详细过程。

布局文件:只有一个ListView

1
2
3
4
5
<relativelayout android:layout_height= "match_parent" android:layout_width= "match_parent" xmlns:android= "http://schemas.android.com/apk/res/android" xmlns:tools= "http://schemas.android.com/tools" >
 
     <listview android:id= "@+id/lv" android:layout_height= "wrap_content" android:layout_width= "wrap_content" >
 
</listview></relativelayout>
ListView每个item布局

1
2
3
4
5
6
<!--?xml version= "1.0" encoding= "utf-8" ?-->
<linearlayout android:layout_height= "match_parent" android:layout_width= "match_parent" android:orientation= "vertical" xmlns:android= "http://schemas.android.com/apk/res/android" >
     
     <imageview android:id= "@+id/item_iv" android:layout_gravity= "center_horizontal" android:layout_height= "100dp" android:layout_width= "100dp" android:src= "@drawable/ic_launcher" >
 
</imageview></linearlayout>
MyAdapter中getView()方法

public MyAdapter(Context context,List data){
	this.context = context;
	this.data = data;
}

@Override
	public View getView(int position, View convertView, final ViewGroup parent) {
		final ViewHolder holder;
		if(convertView ==null){
			...
		}else{
			...
		}
		//获得集合中实体类对象
		final Info info = data.get(position);
		//获得图片网址
		final String img = info.getImgUrl();
		
		//重点1,为每个ImageView设置一个tag,值为图片网址(保证tag的唯一性)。
		holder.iv.setTag(info.getImgUrl());
		...
		
		Bitmap bitmap =/*网络请求来的bitmap*/

		//重点2,获得tag的值,与该item中缩放图片的网址进行比较
		String tag = (String) holder.iv.getTag();
		//如果这个imageview的值,和他应该放的图片的地址值一样,说明这个图片是属于这个ImageView的,可以加载。	
		if(tag!=null&&tag.equals(info.getImg())){
			iv.setImageBitmap(bitmap);
		}

		return convertView;
	}
	
	class ViewHolder{
		TextView tv;
		ImageView iv;
		
	}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值