比如一页正常显示7个item ,当向下滑动一个条目的时候,由于listView的复用原则,如果不异步加载,虽然第一块和第八块指向的是同一个View,但是此时已经刷上了 第8个item 的数据, 而此时的第一块数据 也显示的是第八块数据,只是我们看不到而已,因为此时第一块和第八块指向的是同一块内存。
但是当出现异步加载的时候,如果2个item加载图片 有快有慢 ,所以,慢的一块没加载出来 会显示快的一块,因为他们指向的是同一块内存,所以当设置tag的时候,tag的标示永远是可见的View的url
-------以下是设置viewHolder-----------代码仅供参考--------
1.创建
静态类Viewholder 并声明控件
比如:
//空参构造
static class ViewHolder {
ImageView image;
}
2.在listView的getView 方法中 创建这个viewholder 对象
并且判断convertView 是否为空,如果为空,填充想要展示的item布局,
并且为viewholder 中的控件赋值
3.然后为convertView设置tag
//空参构造
ViewHolder holder = null;
String url = getItem(position).toString();
if (convertView == null) {
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.item, null);
holder.image = (ImageView) convertView.findViewById(R.id.pic);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.image.setImageBitmap(BitmapFactory.decodeFile(url));
// 给 ImageView 设置一个 tag
holder.img.setTag(imgUrl);
// 预设一个图片
holder.img.setImageResource(R.drawable.ic_launcher);
// 通过 tag 来防止图片错位
if (imageView.getTag() != null && imageView.getTag().equals(imageUrl)) {
imageView.setImageBitmap(result);
}