自定义ListView滚动时,图片显示错乱
2016-03-18 16:37
411 查看
为了实现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
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
相关文章推荐
- Java利用 AES/ECB/PKCS5Padding 算法加解密
- MFC 屏蔽ESC和ENTER键 关闭对话框
- iOS获取字符串(中英文都行)大写首字母
- AngularJS简介
- Matlab从图像中选取矩形区域
- AS快捷键 & AS不需要提交的文件
- 深度卷积网络CNN与图像语义分割
- Apche Kafka 的生与死 – failover 机制详解
- ABP源码分析五:ABP初始化全过程
- storm-0.8.2源码分析1之nimbus启动
- DedeCms arclist调用tag标签
- 输入adb shell 时 提示error: more than one device and emulator
- reverse linked list II
- 1加1在什么情况下等于3
- mysql-proxy代理加mysql主从实现读写分离
- SQL Server 插入空间数据
- Lesson 3: Hidden faces removal (z buffer)
- 轻松学习jQuery插件EasyUI EasyUI创建树形菜单
- MFC Edit Control 鼠标离开编辑框时显示消息
- Xcode删除证书和清理编译项目产生的缓存