保存到桌面加入收藏设为首页
IOS开发
当前位置:首页 > IOS开发

揭秘之从RecyclerView滑动监听到Gilde平滑加载图片-安度博客

时间:2019-02-04 14:57:43   作者:   来源:   阅读:52   评论:0
内容摘要:本文应该是RecyclerView的第三篇,今天来讲讲如何让RecyclerView优先加载可见item,如何在RecyclerView滑动中停止图片的加载保证页面流畅。先看效果图:额。算了再流畅GIF也无法展示,想看效果去GITHUB下载代码吧。本文Github代码链接http......
  • 本文应该是RecyclerView的第三篇,今天来讲讲如何让RecyclerView优先加载可见item,如何在RecyclerView滑动中停止图片的加载保证页面流畅。
    先看效果图:
    这里写图片描述
    这里写图片描述

    额。算了再流畅GIF也无法展示,想看效果去GITHUB下载代码吧。
    本文Github代码链接
    https://github.com/AndroidMsky/GlideScrollRecyclerView
    欢迎star哦。

    对下拉刷新上滑加载RecyclerView还不明白的请看:
    http://blog.csdn.net/androidmsky/article/details/52922348
    对多样式布局Gilde基本用法还不懂得请看:
    http://blog.csdn.net/androidmsky/article/details/52944370
    两浓ky"http://www.it165.net/qq/" target="_blank" class="keylink">qq2vMrHscrV37XEsqnOxKOsz+DQxcjrw8W07r2oxvC/ydPDv/K83Lu5ysfT0LDv1vq1xKGjPC9wPgo8cD7Iw87Sw8fAtLvYucvSu8/Cs8K+ybXETGlzdHZpZXejrMjnuftpdGVt1tDT0M34wufNvMaso6zEx8qxuvLO0sPH1PXDtNf2tcTE2KO/ztLDx9Kq16LS4tK7z8K8uLj21ti146O6PGJyIC8+CjEuzfjC5828xqy78cihPGJyIC8+CjIuzfjC5828xqy2/ry2u7q05qOo1sHJ2dK7vLa7urTmo6k8YnIgLz4KMy7U2rjfy9m7rLavyrG68s2j1rnNvMasvNPU2M/fs8w8YnIgLz4KNC7U2rXNy9m7rLavo6zNo9a5u6y2r8qxuvK/qsb0z9+zzDxiciAvPgo1Ls/CwK3LotDCPGJyIC8+CjYuyc+7rLzT1Ng8YnIgLz4KNy7Txc/IvNPU2L/JvPtpdGVtPC9wPgo8cD7I57n7srvTw7XayP23vb/yvNyjrNfUvLrOrLukz9+zzLPYtci1yLarzvejrM/rz+u2vLi01NOho7b4yOe98c7Sw8eyu9Do0qrV4tCptqvO98HLo6yxvs7EtcREb21lx+HH4cvJy8nX9rW91eI3teOhozxiciAvPgrK18/IMSAyIGdsaWRluPjT6M7Sw8fN6sPAtcTWp7PWo6w1IDYgztLHsM7EzOG1vbn9tcRSZWN5Y2xlclZpZXfSstPQzerDwLXE1qez1qGjvfHM7Nb30nk" target="_blank">qq9siAzIDQgN9XiyP2148jnus7Ktc/WoaM8L3A+CjxwPsrXz8i/tDcu08XPyLzT1Ni/ybz7aXRlbaOs1q7HsNTabGlzdHZpZXfO0sPHv8nE3NXi0fnX9qOs0LS49rustq+84Mz9sqLH0rvxyKG/ybz7aXRlbbXEzrvWw6OsyLu687zT1Ni21NOmzbzGrKOsxMfDtM7Sw8fKudPDUmVjeWNsZXJWaWV3K0dpbGRltb2118jnus7X9tXi0ru148TYo6yxytXf0ru/qsq80rLT0NCp08zUpaOs09rKx9axvdNpc3N1ZXO1vcHLZ2l0aHViIKO6PC9wPgo8cD5odHRwczovL2dpdGh1Yi5jb20vYnVtcHRlY2gvZ2xpZGUvaXNzdWVzLzE1NzUjZXZlbnQtODUyNjYwNzU1PC9wPgo8cD48aW1nIGFsdD0="这里写图片描述" src="http://www.it165.net/uploadfile/files/2016/1111/201611111934251052.png" title="" />

    看来老外对于自己的亲儿子项目还是很关爱的生怕我不懂啪啪啪举了几个例子,我只好用CET3.9的水平翻译一下了。
    我的意思是当glide和recyclerview配合使用的时候,glide会不会优先加载可见item。
    TWiStErRob大概说,所有的加载优先级都是默认的,但是可以通过设置priority来这是优先级,但是不是在特别的情况下这个方法一般不被使用,他举了个例子说,如果一个item中有3个图片,他们的信息有重叠的部分,其中有一张图是最重要,信息最全的时候,可以提高这张图的优先级。
    然而TWiStErRob给我的答案似乎并没有理解我想问的(可能是我CET3.9)的原因,我想算啦吧,问别人不如自己实践出来的更真实。于是我准备出如下场景:
    1.网速很渣(因为速度快瞬间加载完很多图难以测试)
    2.打开一个游戏的下载(先把比较渣的网速给我占了!)
    3.item比较多
    4.当前可见item比较少
    5.设置Glide跳过二级缓存
    6.对Glide加载成功进行监听并且打印图片对应位置log

     Glide.with(mContext).load(data.URl) .placeholder(R.mipmap.ic_launcher) .centerCrop() .skipMemoryCache(skipcache) .diskCacheStrategy(DiskCacheStrategy.NONE) .into(new GlideDrawableImageViewTarget(productHolder.imgRight) { @Override public void onResourceReady(GlideDrawable drawable GlideAnimation anim) { super.onResourceReady(drawable anim); Log.d('-------------------+' '' + (position+1)); }

    首先进来缓慢滑动几次:

    这里写图片描述

    前四张图片被加载了符合预期。

    接下来我们快速滑动到底部:

    这里写图片描述

    如我所料,优先加载了可见的底部的item。

    到这里7问题就解决了。我们以正缺的姿势去使用RecyclerView+Gilde就可以了。

    接下来是:
    3.在高速滑动时候停止图片加载线程
    4.在低速滑动,停止滑动时候开启线程
    RecyclerView是可以滑动监听的但是别高兴的太早:

    SuperRefreshRecyclerView.一脸懵逼

    你点不出设置滑动监听方法,其实是这样的:

    public class SuperRefreshRecyclerView extends frameLayout { private RelativeLayout emptyViewerrorView; private SwipeToLoadLayout swipeToLoadLayout; private SwipeLoadMoreFooterLayout swipeLoadMoreFooterLayout; private RecyclerView recyclerView;

    SuperRefreshRecyclerView中有个原声的RecyclerView所以我们肯定不能直接.到RecyclerView的方法了。于是决定自己写个callback接口就好了:

    public interface ChangeScrollStateCallback { public void change(int c);}

    然后提供set方法:

    public void setChangeScrollStateCallback(ChangeScrollStateCallback mChangeScrollStateCallback){ this.mChangeScrollStateCallback=mChangeScrollStateCallback; }

    并在Activity中调用:

    superRecyclerView.setChangeScrollStateCallback(new ChangeScrollStateCallback() {//0 表示停止滑动的状态 SCROLL_STATE_IDLE//1表示正在滚动,用户手指在屏幕上 SCROLL_STATE_TOUCH_SCROLL//2表示正在滑动。用户手指已经离开屏幕 SCROLL_STATE_FLING @Override public void change(int c) { switch (c) { case 2: Glide.with(MainActivity.this).pauseRequests(); Log.d('AAAAAAAAAAAAAAA' '暂停加载' + c); break; case 0: Glide.with(MainActivity.this).resumeRequests(); Log.d('AAAAAAAAAAAAAAA''恢复加载' + c); break; case 1: Glide.with(MainActivity.this).resumeRequests(); Log.d('AAAAAAAAAAAAAAA' '恢复加载' + c); break; } } });

    Glide提供的暂停恢复方法有没有很爽:

    Glide.with(MainActivity.this).pauseRequests();Glide.with(MainActivity.this).resumeRequests();

    高速滑动一下屏幕:

    这里写图片描述

    缓慢滑动屏幕:

    这里写图片描述

    一切符合预期,1-7点我们就这样轻松的完成了。同事也给大家建议,在怀疑一个地方的时候不妨打断点打日志去看看到底是怎么回事,不断提高自己解决问题的能力,不要只会问而不会做。

    欢迎关注作者。欢迎评论讨论。欢迎拍砖。
    如果觉得这篇文章对你有帮助,欢迎打赏,
    欢迎star,Fork我的github。
    喜欢作者的也可以Follow。也算对作者的一种支持。
    本文Github代码链接
    https://github.com/AndroidMsky/GlideScrollRecyclerView

    欢迎加作者自营安卓开发交流群:308372687

    这里写图片描述

    http://blog.csdn.net/androidmsky/article/details/53115818


本站所有站内信息仅供娱乐参考,不作任何商业用途,不以营利为目的,专注分享快乐,欢迎收藏本站!
所有信息均来自:百度一下 (威尼斯人官网)