自定义ListView滚动时,图片显示错乱

为了实现ListView的每个条目的自定义布局,我们一般使用继承了BaseAdaper的适配器,然后在getView方法中设置我们的每个条目。但是今天遇到了条目中图片加载混乱的现象。代码如下

public View getView(int arg0, View arg1, ViewGroup arg2) {
		// TODO Auto-generated method stub
		 final ViewHolder viewHolder;
		 Note node=list.get(arg0);
		 System.out.println(arg0);
	        if (null == arg1)
	        {
	            viewHolder = new ViewHolder();
	            LayoutInflater mInflater = LayoutInflater.from(mContext);
	            arg1 = mInflater.inflate(R.layout.list_item, null);
	            arg1.setLayoutParams(new LinearLayout.LayoutParams(screenWidth,screenHeight/6));
	            viewHolder.label = (TextView) arg1.findViewById(R.id.item_label);
	            viewHolder.time = (TextView) arg1.findViewById(R.id.item_time);
	            viewHolder.content = (TextView) arg1.findViewById(R.id.item_content);
	            viewHolder.image = (ImageView) arg1.findViewById(R.id.item_image);
	            arg1.setTag(viewHolder);
	        }
	        else
	        {
	            viewHolder = (ViewHolder) arg1.getTag();
	        }
	        viewHolder.label.setText(node.getTitle());
	        viewHolder.time.setText(node.getTime());
	        viewHolder.content.setText(node.getContent());
	        if(node.getPicPath()!=null){
	        	viewHolder.image.setImageBitmap(BitmapUtils.zoomImage(BitmapFactory.decodeFile(node.getPicPath()),screenWidth/4,screenHeight/6.5));
	        }
	        return arg1;
	}
	private static class ViewHolder
	    {
	        TextView label;
	        TextView time;
	        TextView content;
	        ImageView image;
	    }
这里为了提高效率重用了ListView的item,问题就出在这个地方,假如我们的屏幕一开始的时候有5个item,并占满了屏幕,系统会为每个item创建一个view。

当我们继续向下滚动到第6个item的时候,如果第一个item滚动出了屏幕,系统会重用第一个item的view(代码中的arg1),这时候我们通过获得arg1的ViewHolder对象来重用该view中的的组件,然后重新设置每个组件中的内容。但是如果item1有图片,而item6没有图片,根据代码,此时的imageView组件不执行动作,但是因为是重用了item1的缘故,此时的imageView任然将留有第一个item的图片。同理,如果向上滚动,上面的item本来没有图片的,往往会加载到底部的图片。此处代码改为

 if(node.getPicPath()!=null){
	        	viewHolder.image.setImageBitmap(BitmapUtils.zoomImage(BitmapFactory.decodeFile(node.getPicPath()),screenWidth/4,screenHeight/6.5));
	        }else{
	        	viewHolder.image.setImageBitmap(null);
	        }
	        return arg1;

在做网络应用的时候,图片往往是异步加载的,这个时候往往容易出现错误,可以参考https://github.com/lesliebeijing/AsyncImageLoader和https://github.com/lesliebeijing/VolleyListViewImageDemo

你可能感兴趣的:(Android)