关于RecyclerView异步加载图片错位的小总结
2017-03-01 18:34
1546 查看
1.总体思路
很明显这个问题在如今的Android开发中已经算不上问题,因为其产生原因,解决方法已经被讨论的非常成熟。这篇博客主要是自己在遇到问题到解决问题的的过程中,总结的一些可以帮助自己理清思路的小套路。这里还是简单说明下问题原因及大致思路。RecyclerView,包括之前用的ListView都存在这个问题。因为有ViewHolder的重用机制,每一个item在移除屏幕后都会被重新使用以节省资源,避免滑动卡顿。而在图片的异步加载过程中,从发出网络请求到完全下载并加载成Bitmap的图片需要花费很长时间,而这时候很有可能原先需要加载图片的item已经划出界面并被重用了。而原先下载的图片在被加载进ImageView的时候没有判断当前的ImageView是不是原先那个要求加载的,故可能图片被加载到被重用的item上,就产生了图片错位的问题。解决思路也很简单,就是在下载完图片,准备给ImageView装上的时候检查一下这个ImageView
还是不是原来那个。
关键伪代码如下:
//给ImageView打上Tag作为特有标记 imageView.setTag(tag); //下载图片 loadImage(); //根据tag判断是不是需要设置给ImageView if(tag == iamgeView.getTag()) { imageView.setBitmapImage(iamge); }
2.注意细节
实现起来难度不大,网上也都解释的很详细了,这里就不说怎么做了。就是一些细节和小技巧可能会需要注意一下。给ImageView打的Tag可以就是图片的url,也可以加上position等位置参数
在加载图片的时候,一定要注意添加tag和判断tag的时机,从日志分析执行的先后顺序,理清逻辑。我就多次在这里踩坑了。比如图片已经下载完成了,但是重用的ImageView还没有覆盖新的tag。
我的ImageView是放在一个子布局 GridLayout里面,数量从0到9。在图片数量为0的时候,注意搞清楚后台返还的urls数组是null还是size()==0。
每次bindViewHolder时,GridLayout注意要removeAllViews()。这样比较简单粗暴,要优化还可以仅仅remove掉多余view,然后注意把剩下的view设置一个默认图片。
在没有加载到图片之前,设置默认的图片资源(我感觉对我用处不大,不过网上都建议这样做)
图片的大小:getWidth()这个方法所依赖的测量值是异步的,所以就有可能得到不准确的值,造成图片大小设置不恰当。
3.时间及事件梳理
因为自己在这里踩坑太多且花了很长时间才爬出来,所以着重记录一下。开始->当前item1给ImageView打tag
->当前item1发起网络请求
->异步处理网络请求
->当前item1滑出屏幕
->划出屏幕的item重用并滑进屏幕命名为item2
->item2重新给ImageView打上tag
->item1的图片下载完成,因为重用的原因,图片将要加载给item2
->用原先传入的item1设置的tag和新覆盖的tag比较,发现不相同
->不给当前item2设置图片,避免了图片错位
4.代码
想了下,我写的太多关于自己布局和业务的东西,不适合单独拿出来说明问题,就不贴了。以后有空了单独写一个出来用作示例。相关文章推荐
- 【Android】ListView、RecyclerView异步加载图片引起错位问题
- Android ListView,GridView,RecyclerView图片加载错位闪动问题解决办法
- 关于在RecyclerView中使用UniversalImageLoader加载图片刷新数据时引起的闪烁问题
- Android ListView异步加载图片错位解决方案一 使用findViewWithTag
- ios UITableView 异步加载图片并防止错位
- ios UITableView 异步加载图片并防止错位
- iOS tableView 异步加载图片时错位问题
- RecyclerView异步加载图片乱序问题
- RecyclerView中,图片加载重用问题,异步加载图片
- ListView、RecyclerView CheckBox 单选实现,以及RecyclerView异步加载网络图片
- ios UITableView 异步加载图片并防止错位
- 关于使用uitableview 中cell 来实现uiimageview的复用和图片的异步加载
- 使用Android Studio 练习RecyclerView 异步加载图片,解决图片乱序问题。
- Android-自定义TextView和异步加载图片的实现
- 关于异步加载网络图片的方法
- Android实现ListView异步加载图片总结
- 关于TableView中图片的延时加载
- Android-自定义TextView和异步加载图片的实现
- Android在网络异步加载图片方式总结
- 关于TableView中图片的延时加载