闲来无事,研究了一下当今比较常用的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大家可以下载看看。
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大家可以下载看看。