listview滑动数据错乱

闲来无事,研究了一下当今比较常用的imagloader,无意中发现了listview滑动数据错乱的问题,好了这下有的玩了。在这还是有些小小的兴奋。
ok~闲话不多说了。遇到这个问题首先想到的是什么原因造成的。现在就和大家一起分享一下关于adapter的复用机制。在这我们就拿listview来说事。当我们首次显示出listview这时adapter会默认给我们加载出当前屏幕所显得的item我们那对view添加tag并且保存到holder中。如下:
View view;
view=convertView;
ViewHolder holder=null;
if (convertView==null) {
view=LayoutInflater.from(context).inflate(R.layout.item_list_image, null);
holder=new ViewHolder();
holder.imageView=(ImageView) view.findViewById(R.id.image);
holder.textView=(TextView) view.findViewById(R.id.text);
view.setTag(holder);
}
当我们触发滑动时adapter会当首个item滑出屏幕则会被即将显示的item所复用,所以它的布局也不会被创建而是再次利用已经滑出屏幕的首个ITem来呈现数据。如下:
else {

holder= (ViewHolder) view.getTag();
holder.imageView.setTag(position);
ImageLoader.getInstance().displayImage(url[position],holder.imageView);
}
因此当我们滑动时则会出现数据的混乱,图片错位。好了,到这我们已经找到了出现数据混乱的原因了,那么现在我们就来做一下处理吧,在这比较常见的则是图片错位,闪烁问题。那么接下来我们就针对图片错位这一问题进行处理:


@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
view=convertView;
ViewHolder holder=null;
//if (lmap.get(position)==null) {
if (convertView==null) {
view=LayoutInflater.from(context).inflate(R.layout.item_list_image, null);
holder=new ViewHolder();
holder.imageView=(ImageView) view.findViewById(R.id.image);
holder.imageView.setTag(position);
holder.textView=(TextView) view.findViewById(R.id.text);
view.setTag(holder);
//lmap.put(position,view);
}
else {

holder= (ViewHolder) view.getTag();
//Log.i("weiz===","Tag1111111aaaaa:::"+holder.imageView.getTag());
holder.imageView.setTag(position);
holder.imageView.setImageResource(R.drawable.ic_empty);
ImageLoader.getInstance().displayImage(url[position],holder.imageView);
}

holder.textView.setText("第 "+position+"图片");
// imageLoader.displayImage(url[position], holder.imageView);   //第一種方法
// ImageLoader.getInstance().displayImage(url[position], holder.imageView, options);  
// ImagerLoder.getImageLoader().displayImage(url[position], holder.imageView, options);
//实现图片圆角

if(position==(Integer)holder.imageView.getTag()){

ImageLoader.getInstance().displayImage(url[position],holder.imageView);
}

return view;
}
  static class ViewHolder
  {
 ImageView imageView;
 TextView textView;
  }
我们给每个imageview添加一个标示,我们通过表示来找到对应的图片进项显示这样就不会出现错位了。但还有一个问题,图片虽然不会错位了,但是加载过程中会出现图片闪烁。所以当imageview出现复用时。我们给它加载一张默认图片这样。就可以避免了。好了,说到这这个问题就基本解决了。
下面是相关的demo大家可以下载看看。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值