ListView图片加载错乱原因及解决方案?

前言

这篇文章主要记录下,ListView图片加载错乱原因以及如何解决,相信刚开始做android开发的小伙伴绝大部分应该都有遇到过这样的问题,那么接下来让我们一起分析下图片错乱的原因以及如何去解决。

1. 概述


ListView加载图片时,同步加载不会出现问题,但是异步加载图片时可能会出现图片错位乱序问题;

这里举个例子,异步请求网络图片,然后给ListView设置到ImageView控件上边:

移出屏幕的ImageView控件会进入到RecyclerBin中,而新进入屏幕的元素会从RecyclerBin中获取ImageView控件,每当有新元素进入界面时,都会调用getView()方法,快速滑动ListView可能会出现下边的情况。

2. ListView图片加载错乱原因


分析:

1>:某一个位置的元素刚进入屏幕开始请求图片,图片没有下载完成,就被移出屏幕,根据ListView工作原理可知,被移出屏幕的控件会很快的被重复利用起来,如果在这个时候之前发起图片的请求有了响应,会将刚才位置的图片显示到当前位置,虽然他们位置不同,却共用着同一个ImageView实例,这个时候会出现图片乱序;
2>:新进入屏幕的元素也会去请求图片,等图片下载完的时候会设置到同样的ImageView,因此就出现先显示一张图片,然后又变为另一张图片,就造成图片变来变去;

分析结果如下:

  • 比如现在是第一屏幕数据,第一屏的某个位置去请求图片,这个时候你把ListView第一屏数据滑动出去了,根据ListView工作机制可知,被滑动出去的数据会很快的又被第二屏再次利用;
  • 这个时候第二屏幕的同一个位置也请求图片并在该位置显示图片,这个时候如果刚才第一屏同一个位置请求图片有了响应,也在同一个位置显示图片,因此就出现先显示一张图片,然后又变为另一张图片,就造成图片变来变去;

3. 解决方案


方法1:findViewWithTag

1>:在getView()方法中用url地址给ImageView设置tag标记;
2>:在onPostExecute()方法中调用 mListView.findViewWithTag(imageUrl) 获取ImageView实例,然后判断如果不为null,就把drawable图片设置到该ImageView控件上即可;

findViewWithTag原理?

使用findViewWithTag就不会出现乱序,原因就是ImageView都是重用的。移出屏幕的ImageView会很快再次进入屏幕,被重新利用,重新调用getView()方法,在getView()方法中会给ImageView设置新的tag,老的tag会被重新覆盖掉,这个时候再调用 findViewWithTag()然后传入老的tag,会得到null,而我们判断只有imageView不为null的时候才给ImageView设置drawable图片;

你可能感兴趣的:(ListView图片加载错乱原因及解决方案?)