RecycleView局部刷新闪动的问题

腾讯老司机的RecyclerView局部刷新爬坑之路

转载 2016年10月21日 16:15:18



作者:Hoolly,腾讯移动客户端开发工程师。 商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处
WeTest导读安卓开发者都知道,RecyclerView比ListView要灵活的多,但不可否认的里面的坑也同样埋了不少人。下面让我们看看腾讯开发工程师用实例讲解自己踩坑时的解决方案和心路历程。 话说有图有真相,首先来对比一下局部刷新前后的效果:

优化之前的效果:



优化之后的效果:


可以看到,优化之后,列表中的这张大图不在有一闪一闪亮晶晶的效果了!

那么,这是如何做到的呢?这是本文的重点,本文的大纲主要包括:
  1. 分析为什么会闪一下

  2. 对分析的可能造成闪动的问题进行解决

  3. 验证是否解决


 一、为什么会闪一下?

我们的需求是大家已经看到了,点击打分,弹出一个对话框,点击一个分数,这时候,通过一些列复杂的转换(当然不是本文的论述的重点),这时候到了要更新列表项了,如是很自然,我们会这么做:


因为,操作的那个列表项你是知道他的position,所以你可以这么做,(当然,我之前是直接notifyDataSetChanged的,这个会照成所以不不要的item也会刷新)然而,闪动还是出现了,那么我开始怀疑:
  1. 流传甚为广泛的一种说法,imageView的宽高不固定导致的(wrap_content)?

  2. 这个是RecyclerView自带的更新动画效果导致的?

  3. 这个是因为图片加载框架(glide 的 animte)的动画效果导致的?

  4. getView中(RecyclerView中是onBindViewHolder)加载图片的时候,设置一个tag,当发现这个imageView的tag和之前的tag一致时就不加载



二、带着思考,就去尝试吧!

1、对于第一种,我的做法是自己写了一个自定义的imageView,重写omMeasure方法,如下:


因为我们的这个列表项中的图片是(高=宽)的,因此,我才这么写,这样写也有一个好处,不用在onBindViewHolder中去动态的计算出高度,然后在已layoutParm的方式设置给imageView,相信不少小伙伴都做过了吧!

然而,遗憾的是,他并没有解决闪一下的问题!此时这个闪动的原因显然不在这里,但是这里做的,可以保留下来。


2、对于第二种说法,我参考了这里 http://stackoverflow.com/questions/29331075/recyclerview-blinking-after-notifydatasetchanged

的做法:


以及也尝试了这种


然而,那种渐变的闪动消失了,但是,取而代之的是一种更加不可接受的闪动,这里就不用gif展示了,因此原因也并不在此处。


3、对于对三种说法,我也去尝试了一下将glide加载改为:


然而得到的依然是一个失望的结果,依然没有解决闪动的问题,原因也不在此处。


4、那么,就剩下最后一个猜测了,那么会不会是它呢?那就试试吧,于是代码改为:


这里的做法其实就是设置Tag,那么是骡子是马,拉出来溜溜吧,结果更加令人发指,如图:


好吧,此时已经有点崩溃了,显然这个也不是我要的结果,那么此时是否应该在静下来想一想,自己对于可能的几种原因做过的一些对策,是否有哪里遗漏了。经过思考,发现并没有!!那么一定是还有其他的原因,没有考虑到!

还是去翻一翻RecyclerView的api吧,我注意到了这个api:



可以看到这里有一个payload的参数,use null to identify a “full” update这是说如果传null就是全部更新,回过头去看一看我们之前的调用方式:

看一下源码,发现


实际上,payload这个参数就是传的null,那也就是说如果传一个不为null的参数,就可以对列表项中的具体控件更新了?

http://stackoverflow.com/questions/33176336/need-an-example-about-recyclerview-adapter-notifyitemchangedint-position-objec

我了解到这个方法的使用方式是这样的:


然来,onBindViewHolder有这么一个重载方式,如是我也这么做了,在下面这个重载中,去更新我想更新的控件:


然后,更新的方式变成了这种:


是骡子是马,那就在遛一遛吧!

然而,依然是会闪一下!!!这这么会!!!还是调试一下吧,新重载onBindViewHolder方法有没有被执行,一更代码,发现果然没有被执行! 那么,究竟是什么鬼?去网上查了一下,有人给出了一个解决办法:

http://stackoverflow.com/questions/32463136/recyclerview-adapter-notifyitemchanged-never-passes-payload-to-onbindviewholde


需要重写这个动画,让永远返回true,已达到newHolder和olderHolder是同一个,然而,这真的就是我的救命稻草吗?


那么,是骡子是马,拉出来溜溜吧,然而,并不是马!!进源码看一看


发现其实只要我们传入的payload不为空,那么返回的就是true?重写有意义吗?显然,我重载的onBindViewHolder方法并没有执行的原因显然不是这个。

那么,到底,到底问题出在何处?会不会是XrecyclerView的问题?根据调用栈,我看到第一个onBindViewHolder被执行了,往上面跟,发现XrecyclerView的实现果然存在问题!



如图,作者仅仅只实现了,不带payload的方法,最后adapter调用的只有不带paylaod的方法!所以,重写一个吧!


最后!终于达到了想要的效果了,经过这次爬坑,选择一个开源的框架真滴是需要慎重再慎重。

总结

实际上RecyclerView做局部刷新是非常容易的,其实就是使用好带payload参数的这个notifyItemRangeChanged方法,以及override带payload的这个onBindViewHolder方法,在onBindViewHolder中去刷新你想更新的控件即可,并非是网上传闻的那些原因,当然此处爬坑时间之长,也可能更选用开源控件不当有关,所以,选择开源控件,要谨慎再谨慎!


作者:Hoolly,腾讯移动客户端开发工程师。 商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处
WeTest导读安卓开发者都知道,RecyclerView比ListView要灵活的多,但不可否认的里面的坑也同样埋了不少人。下面让我们看看腾讯开发工程师用实例讲解自己踩坑时的解决方案和心路历程。 话说有图有真相,首先来对比一下局部刷新前后的效果:

优化之前的效果:



优化之后的效果:


可以看到,优化之后,列表中的这张大图不在有一闪一闪亮晶晶的效果了!

那么,这是如何做到的呢?这是本文的重点,本文的大纲主要包括:
  1. 分析为什么会闪一下

  2. 对分析的可能造成闪动的问题进行解决

  3. 验证是否解决


 一、为什么会闪一下?

我们的需求是大家已经看到了,点击打分,弹出一个对话框,点击一个分数,这时候,通过一些列复杂的转换(当然不是本文的论述的重点),这时候到了要更新列表项了,如是很自然,我们会这么做:


因为,操作的那个列表项你是知道他的position,所以你可以这么做,(当然,我之前是直接notifyDataSetChanged的,这个会照成所以不不要的item也会刷新)然而,闪动还是出现了,那么我开始怀疑:
  1. 流传甚为广泛的一种说法,imageView的宽高不固定导致的(wrap_content)?

  2. 这个是RecyclerView自带的更新动画效果导致的?

  3. 这个是因为图片加载框架(glide 的 animte)的动画效果导致的?

  4. getView中(RecyclerView中是onBindViewHolder)加载图片的时候,设置一个tag,当发现这个imageView的tag和之前的tag一致时就不加载



二、带着思考,就去尝试吧!

1、对于第一种,我的做法是自己写了一个自定义的imageView,重写omMeasure方法,如下:


因为我们的这个列表项中的图片是(高=宽)的,因此,我才这么写,这样写也有一个好处,不用在onBindViewHolder中去动态的计算出高度,然后在已layoutParm的方式设置给imageView,相信不少小伙伴都做过了吧!

然而,遗憾的是,他并没有解决闪一下的问题!此时这个闪动的原因显然不在这里,但是这里做的,可以保留下来。


2、对于第二种说法,我参考了这里 http://stackoverflow.com/questions/29331075/recyclerview-blinking-after-notifydatasetchanged

的做法:


以及也尝试了这种


然而,那种渐变的闪动消失了,但是,取而代之的是一种更加不可接受的闪动,这里就不用gif展示了,因此原因也并不在此处。


3、对于对三种说法,我也去尝试了一下将glide加载改为:


然而得到的依然是一个失望的结果,依然没有解决闪动的问题,原因也不在此处。


4、那么,就剩下最后一个猜测了,那么会不会是它呢?那就试试吧,于是代码改为:


这里的做法其实就是设置Tag,那么是骡子是马,拉出来溜溜吧,结果更加令人发指,如图:


好吧,此时已经有点崩溃了,显然这个也不是我要的结果,那么此时是否应该在静下来想一想,自己对于可能的几种原因做过的一些对策,是否有哪里遗漏了。经过思考,发现并没有!!那么一定是还有其他的原因,没有考虑到!

还是去翻一翻RecyclerView的api吧,我注意到了这个api:



可以看到这里有一个payload的参数,use null to identify a “full” update这是说如果传null就是全部更新,回过头去看一看我们之前的调用方式:

看一下源码,发现


实际上,payload这个参数就是传的null,那也就是说如果传一个不为null的参数,就可以对列表项中的具体控件更新了?

http://stackoverflow.com/questions/33176336/need-an-example-about-recyclerview-adapter-notifyitemchangedint-position-objec

我了解到这个方法的使用方式是这样的:


然来,onBindViewHolder有这么一个重载方式,如是我也这么做了,在下面这个重载中,去更新我想更新的控件:


然后,更新的方式变成了这种:


是骡子是马,那就在遛一遛吧!

然而,依然是会闪一下!!!这这么会!!!还是调试一下吧,新重载onBindViewHolder方法有没有被执行,一更代码,发现果然没有被执行! 那么,究竟是什么鬼?去网上查了一下,有人给出了一个解决办法:

http://stackoverflow.com/questions/32463136/recyclerview-adapter-notifyitemchanged-never-passes-payload-to-onbindviewholde


需要重写这个动画,让永远返回true,已达到newHolder和olderHolder是同一个,然而,这真的就是我的救命稻草吗?


那么,是骡子是马,拉出来溜溜吧,然而,并不是马!!进源码看一看


发现其实只要我们传入的payload不为空,那么返回的就是true?重写有意义吗?显然,我重载的onBindViewHolder方法并没有执行的原因显然不是这个。

那么,到底,到底问题出在何处?会不会是XrecyclerView的问题?根据调用栈,我看到第一个onBindViewHolder被执行了,往上面跟,发现XrecyclerView的实现果然存在问题!



如图,作者仅仅只实现了,不带payload的方法,最后adapter调用的只有不带paylaod的方法!所以,重写一个吧!


最后!终于达到了想要的效果了,经过这次爬坑,选择一个开源的框架真滴是需要慎重再慎重。

总结

实际上RecyclerView做局部刷新是非常容易的,其实就是使用好带payload参数的这个notifyItemRangeChanged方法,以及override带payload的这个onBindViewHolder方法,在onBindViewHolder中去刷新你想更新的控件即可,并非是网上传闻的那些原因,当然此处爬坑时间之长,也可能更选用开源控件不当有关,所以,选择开源控件,要谨慎再谨慎!





$(".MathJax").remove();



          </div>
  <ul class="article_collect clearfix csdn-tracking-statistics tracking-click" data-mod="popu_378" style="display: none;">
      <li class="tit">本文已收录于以下专栏:</li>





                  <form action="https://blog.csdn.net/lf0814/phoenix/comment/submit?id=52884569" method="post" onsubmit="return subform(this);" id="commentform">
                      <textarea class="comment_content" name="comment_content" id="comment_content" placeholder="写下你的评论…" style="height: 28px;"></textarea>
                      <div class="bot_bar clearfix" style="opacity: 0;">
                          <div id="ubbtools" class="add_code">
                              <a href="#insertcode" code="code" target="_self"><i class="icon iconfont icon-daima"></i></a>
                          </div>

                          <input type="hidden" id="comment_replyId" name="comment_replyId">
                          <input type="hidden" id="comment_userId" name="comment_userId" value="">
                          <input type="hidden" id="commentId" name="commentId" value="">
                          <input type="submit" class="btn btn-redborder" value="发表评论">
                          <span id="tip_comment" class="tip">
                          <div style="display: none;" class="csdn-tracking-statistics tracking-click" data-mod="popu_384"><a href="#" target="_blank" class="comment_area_btn">发表评论</a></div>

                          <div id="lang_list" code="code">
                              <a href="#html" style="width:95px;" class="long_name" target="_self">HTML/XML</a>
                              <a href="#objc" style="width:95px;" class="long_name" target="_self">objective-c</a>
                              <a href="#delphi" style="width:58px;" class="zhong_name" target="_self">Delphi</a>
                              <a href="#ruby" class="zhong_name" target="_self">Ruby</a>
                              <a href="#php" target="_self">PHP</a>
                              <a href="#csharp" class="duan_name" target="_self">C#</a>
                              <a style=" border-right: none;" href="#cpp" class="duan_name" target="_self">C++</a>
                              <a style=" border-bottom:none;width:95px;" href="#javascript" class="long_name" target="_self">JavaScript</a>
                              <a style=" border-bottom:none;width:95px;" href="#vb" class="long_name" target="_self">Visual Basic</a>
                              <a style=" border-bottom:none;" href="#python" class="zhong_name" target="_self">Python</a>
                              <a style=" border-bottom:none;" href="#java" class="zhong_name" target="_self">Java</a>
                              <a style="border-bottom:none;" href="#css" class="duan_name" target="_self">CSS</a>
                              <a style="border-bottom:none;" href="#sql" class="duan_name" target="_self">SQL</a>
                              <a style="border:none; " href="#plain" class="duan_name" target="_self">其它</a>
                              <span class="arrb"></span>
                          </div>
                      </span></div>
                  </form>
              </div>
                          </div>
      </div>
  </div>
  <div class="comment_li_outbox">
      <div id="comment_list"> <div class="comment_li_box clearfix">         <dl class="comment_list clearfix" id="comment_item_7347165">           <dt>               <a href="/yx284853845love"><img src="https://avatar.csdn.net/A/9/6/3_yx284853845love.jpg" alt="yx284853845love"></a></dt>           <dd>             <ul class="com_r clearfix">               <li class="top bot clearfix">                 <h4><a href="/yx284853845love">yx284853845love</a></h4>                 <span class="time">2017-11-17 09:21</span>                 <span class="floor_num" floor="1">#1楼</span>                   <div>                     <a href="#reply" class="com_reply btn btn-noborder reply_btn" title="回复" commentid="7347165" floor="1">回复</a>                   </div>               </li>               <li class="mid clearfix">                 <div class="comment_p">源码在哪。。。</div>               </li>               <li class="bot clearfix">                </li>              </ul>            </dd>          </dl><div class="child_comment" data-listshow="false">   <div class="autoHeight clearfix">   </div></div>       </div><div class="clear"></div></div>
  </div>

  <div class="more_comment" style="display: block;">
      <div id="comment_bar" class="trackgin-ad" data-mod="popu_385" style="display: none;"><a id="load_comments" class="btn btn-large more_comment_btn" page="2">查看 <span>1</span> 条热评<i class="icon iconfont icon-xiajiantou"></i></a></div>
  </div>

  <!-- <h3 class="recommend_tit" id="related">相关文章推荐</h3> -->
  <div class="recommend_list clearfix" id="rasss">
                                      <dl class="clearfix csdn-tracking-statistics recommend_article recommend_article_out" data-mod="popu_387" data-poputype="feed" data-feed-show="false" data-dsm="post">
            <a href="https://blog.csdn.net/jdsjlzx/article/details/52893469" target="_blank" strategy="BlogCommendFromBaidu_0">
                <dd>
                    <h2 style="margin-bottom: 0px;">再说Android RecyclerView局部刷新那个坑</h2>
                    <ul class="floatR">
                        <li class="avatar_img"><img src="https://avatar.csdn.net/2/9/C/3_jdsjlzx.jpg" alt="jdsjlzx" title="jdsjlzx"></li>
                        <li class="user_name">jdsjlzx</li>
                        <li class="time">2016年10月22日 17:06</li>
                        <li class="visited_num"><i class="icon iconfont icon-read"></i><span>28866</span></li>
                    </ul><div class="summary">
                        关键:public final void notifyItemChanged(int position, Object payload)RecyclerView局部刷新大家都遇到过,有时候还说会遇见图...                        </div>


                </dd>
            </a>
        </dl>
                                                <dl class="clearfix csdn-tracking-statistics recommend_article recommend_article_out" data-mod="popu_387" data-poputype="feed" data-feed-show="false" data-dsm="post">
            <a href="https://blog.csdn.net/gan303/article/details/52055284" target="_blank" strategy="BlogCommendFromBaidu_1">
                <dd>
                    <h2 style="margin-bottom: 0px;">android recycleView局部刷新的选择</h2>
                    <ul class="floatR">
                        <li class="avatar_img"><img src="https://avatar.csdn.net/1/B/6/3_gan303.jpg" alt="gan303" title="gan303"></li>
                        <li class="user_name">gan303</li>
                        <li class="time">2016年07月28日 14:58</li>
                        <li class="visited_num"><i class="icon iconfont icon-read"></i><span>5810</span></li>
                    </ul><div class="summary">
                        android中recycleview的运用随着android系统的更新以及手机硬件的更新迭代,已经越来越广泛。

而其中的局部刷新便是许多需求都要求实现的基础功能。
那么对于如何局部刷新而言。方式一般…

                </dd>
            </a>
        </dl>
                                      <dl class="">
        <script>
        (function() {
          var s = "_" + Math.random().toString(36).slice(2);
          document.write('<div id="' + s + '"></div>');
          (window.slotbydup=window.slotbydup || []).push({
            id: '4765209',
            container: s,
            size: '808,120',
            display: 'inlay-fix'
          });
        })();
        </script><div id="_q5r2yp3kvmc"></div>
      </dl>
                                    <dl class="clearfix csdn-tracking-statistics recommend_article recommend_article_out" data-mod="popu_387" data-poputype="feed" data-feed-show="false" data-dsm="post">
            <a href="https://blog.csdn.net/u012790961/article/details/49804805" target="_blank" strategy="BlogCommendFromBaidu_2">
                <dd>
                    <h2 style="margin-bottom: 0px;">RecyclerView的局部刷新</h2>
                    <ul class="floatR">
                        <li class="avatar_img"><img src="https://avatar.csdn.net/B/4/A/3_u012790961.jpg" alt="u012790961" title="u012790961"></li>
                        <li class="user_name">u012790961</li>
                        <li class="time">2015年11月12日 21:15</li>
                        <li class="visited_num"><i class="icon iconfont icon-read"></i><span>9258</span></li>
                    </ul><div class="summary">
                        一直纠结于RecyclerView的局部刷新,终于解决了. 

因为要实现的效果要不断地去刷新item中的某些控件数据
所以使用notifydatachangedset(),notifyitemdat…

                </dd>
            </a>
        </dl>
                                                <dl class="clearfix csdn-tracking-statistics recommend_article recommend_article_out" data-mod="popu_387" data-poputype="feed" data-feed-show="false" data-dsm="post">
            <a href="https://blog.csdn.net/qq541976141/article/details/51485732" target="_blank" strategy="BlogCommendFromBaidu_3">
                <dd>
                    <h2 style="margin-bottom: 0px;">Recylerview局部刷新</h2>
                    <ul class="floatR">
                        <li class="avatar_img"><img src="https://avatar.csdn.net/A/4/A/3_qq541976141.jpg" alt="qq541976141" title="qq541976141"></li>
                        <li class="user_name">qq541976141</li>
                        <li class="time">2016年05月23日 23:29</li>
                        <li class="visited_num"><i class="icon iconfont icon-read"></i><span>633</span></li>
                    </ul><div class="summary">
                        Recylerview局部刷新                        </div>


                </dd>
            </a>
        </dl>
                                                <dl class="clearfix csdn-tracking-statistics recommend_article recommend_article_out" data-mod="popu_387" data-poputype="feed" data-feed-show="false" data-dsm="post">
            <a href="https://blog.csdn.net/wjt_developer/article/details/53366900" target="_blank" strategy="BlogCommendFromBaidu_4">
                <dd>
                    <h2 style="margin-bottom: 0px;">RecycleView局部刷新</h2>
                    <ul class="floatR">
                        <li class="avatar_img"><img src="https://avatar.csdn.net/3/0/0/3_wjt_developer.jpg" alt="wjt_developer" title="wjt_developer"></li>
                        <li class="user_name">wjt_developer</li>
                        <li class="time">2016年11月27日 21:17</li>
                        <li class="visited_num"><i class="icon iconfont icon-read"></i><span>213</span></li>
                    </ul><div class="summary">
                        有时候我们需要用RecycleView来展示网络数据,如果做了加载更多功能,那么我们调用传统的notifyDataSetChanged方法,必然会刷新全部的Item,既耗内存,又耗流量(假如没有缓存)...                        </div>


                </dd>
            </a>
        </dl><dl id="_1diimddz5wf"></dl>
                                                <dl class="clearfix csdn-tracking-statistics recommend_article recommend_article_out" data-mod="popu_387" data-poputype="feed" data-feed-show="false" data-dsm="post">
            <a href="https://blog.csdn.net/Captive_Rainbow_/article/details/71438872" target="_blank" strategy="BlogCommendFromBaidu_5">
                <dd>
                    <h2 style="margin-bottom: 0px;">RecyclerView局部刷新的应用场景简单分析</h2>
                    <ul class="floatR">
                        <li class="avatar_img"><img src="https://avatar.csdn.net/7/1/A/3_captive_rainbow_.jpg" alt="Captive_Rainbow_" title="Captive_Rainbow_"></li>
                        <li class="user_name">Captive_Rainbow_</li>
                        <li class="time">2017年05月09日 09:08</li>
                        <li class="visited_num"><i class="icon iconfont icon-read"></i><span>946</span></li>
                    </ul><div class="summary">
                        RecyclerView 局部刷新的应用场景巩固今天在做通讯录屏蔽时,由于通讯录列表里有两种不同的效果展示:1. 已经屏蔽的 item ,显示一个按钮“解除屏蔽”

2. 未屏蔽的 item ,显示两个…

                </dd>
            </a>
        </dl>
                                                <dl class="clearfix csdn-tracking-statistics recommend_article recommend_article_out" data-mod="popu_387" data-poputype="feed" data-feed-show="false" data-dsm="post">
            <a href="https://blog.csdn.net/qq15357971925/article/details/78043332" target="_blank" strategy="BlogCommendFromBaidu_6">
                <dd>
                    <h2 style="margin-bottom: 0px;">android RecyclerView局部刷新</h2>
                    <ul class="floatR">
                        <li class="avatar_img"><img src="https://avatar.csdn.net/8/1/8/3_qq15357971925.jpg" alt="qq15357971925" title="qq15357971925"></li>
                        <li class="user_name">qq15357971925</li>
                        <li class="time">2017年09月20日 17:29</li>
                        <li class="visited_num"><i class="icon iconfont icon-read"></i><span>1850</span></li>
                    </ul><div class="summary">
                        项目中列表需要有点赞的功能,这时我们想到RecyclerView比listview的好处就是,recyclerview有单条item刷新的方法,于是就调用了RecyclerView的notifyIte...                        </div>


                </dd>
            </a>
        </dl>
                                                <dl class="clearfix csdn-tracking-statistics recommend_article recommend_article_out" data-mod="popu_387" data-poputype="feed" data-feed-show="false" data-dsm="post">
            <a href="https://blog.csdn.net/jdsjlzx/article/details/50445424" target="_blank" strategy="BlogCommendFromBaidu_7">
                <dd>
                    <h2 style="margin-bottom: 0px;">Android RecyclerView更新某条/一条数据</h2>
                    <ul class="floatR">
                        <li class="avatar_img"><img src="https://avatar.csdn.net/2/9/C/3_jdsjlzx.jpg" alt="jdsjlzx" title="jdsjlzx"></li>
                        <li class="user_name">jdsjlzx</li>
                        <li class="time">2016年01月01日 17:30</li>
                        <li class="visited_num"><i class="icon iconfont icon-read"></i><span>12018</span></li>
                    </ul><div class="summary">
                        注意:使用notifyItemRemoved(position)更新数据之前,还必须集合中删除该数据:mDatas.remove(position),否则不更新。

更新数据 

这里更新数据集不…

                </dd>
            </a>
        </dl>
                                                <dl class="clearfix csdn-tracking-statistics recommend_article recommend_article_out" data-mod="popu_387" data-poputype="feed" data-feed-show="false" data-dsm="post">
            <a href="https://blog.csdn.net/professionIT/article/details/52886249" target="_blank" strategy="BlogCommendFromBaidu_8">
                <dd>
                    <h2 style="margin-bottom: 0px;">RecyclerView局部刷新的坑</h2>
                    <ul class="floatR">
                        <li class="avatar_img"><img src="https://avatar.csdn.net/6/2/F/3_professionit.jpg" alt="professionIT" title="professionIT"></li>
                        <li class="user_name">professionIT</li>
                        <li class="time">2016年10月21日 18:51</li>
                        <li class="visited_num"><i class="icon iconfont icon-read"></i><span>10070</span></li>
                    </ul><div class="summary">
                        话说有图有真相,首先来对比一下局部刷新前后的效果:

优化之前的效果:

优化之后的效果:

可以看到,优化之后,列表中的这张大图不在有一闪一闪亮晶晶的效果了!

那么,这是如何做到的呢?这是本…

                </dd>
            </a>
        </dl>
                                                <dl class="clearfix csdn-tracking-statistics recommend_article recommend_article_out" data-mod="popu_387" data-poputype="feed" data-feed-show="false" data-dsm="post">
            <a href="https://blog.csdn.net/u014583590/article/details/52135085" target="_blank" strategy="BlogCommendFromBaidu_9">
                <dd>
                    <h2>ListView/RecyclerView的item中有进度条的处理</h2>
                    <div class="summary">
                        之所以特意提出是有进度条的情况,是因为进度条刷新的频率非常高,如果是在进度刷新的时候调用notifyDataSetChanged或者notifyItemChanged方法虽然可以实现刷新,但是界面会频...                        </div>

                    <ul>
                        <li class="avatar_img"><img src="https://avatar.csdn.net/E/3/9/3_u014583590.jpg" alt="u014583590" title="u014583590"></li>
                        <li class="user_name">u014583590</li>
                        <li class="time">2016年08月06日 11:10</li>
                        <li class="visited_num"><i class="icon iconfont icon-read"></i><span>3435</span></li>
                    </ul>
                </dd>
            </a>
        </dl><dl id="yd_a_d_feed_11" class="yd_a_d_feed_cla" style="height:124px;overflow: hidden;"><div></div></dl>
                                                              <dl class="clearfix csdn-tracking-statistics recommend_article recommend_article_out" data-mod="popu_387" data-poputype="feed" data-feed-show="false" data-dsm="post">
            <a href="https://blog.csdn.net/cumtsx/article/details/51834797" target="_blank" strategy="BlogCommendFromBaidu_10">
                <dd>
                    <h2>Recyclerview刷新延迟的问题(刷新两次才更新数据)</h2>
                    <div class="summary">
                        最近闲来开发一个自己游戏公会的小应用,成员介绍模块的实现用到了Recyclerview,从后台获取成员的详细信息然后Recyclerview展示。实现下拉刷新数据时,遇到了一个问题:后台数据更新后,下...                        </div>

                    <ul>
                        <li class="avatar_img"><img src="https://avatar.csdn.net/7/A/7/3_cumtsx.jpg" alt="cumtsx" title="cumtsx"></li>
                        <li class="user_name">cumtsx</li>
                        <li class="time">2016年07月05日 21:31</li>
                        <li class="visited_num"><i class="icon iconfont icon-read"></i><span>3463</span></li>
                    </ul>
                </dd>
            </a>
        </dl>
                                                <dl class="clearfix csdn-tracking-statistics recommend_article recommend_article_out" data-mod="popu_387" data-poputype="feed" data-feed-show="false" data-dsm="post">
            <a href="https://blog.csdn.net/hello_1s/article/details/54136264" target="_blank" strategy="BlogCommendFromBaidu_11">
                <dd>
                    <h2>RecyclerView使用、上拉加载、局部刷新、多种布局、点击事件和坑</h2>
                    <div class="summary">
                        一、Recycler的基础使用先来了解一下它是干啥的:

可以实现ListView的效果
可以实现GridView的效果
可以实现瀑布流的效果
主要是通过设置它的setLayoutManager来决…

                    <ul>
                        <li class="avatar_img"><img src="https://avatar.csdn.net/7/6/9/3_hello_1s.jpg" alt="hello_1s" title="hello_1s"></li>
                        <li class="user_name">hello_1s</li>
                        <li class="time">2017年01月06日 12:25</li>
                        <li class="visited_num"><i class="icon iconfont icon-read"></i><span>2981</span></li>
                    </ul>
                </dd>
            </a>
        </dl>
                                                <dl class="clearfix csdn-tracking-statistics recommend_article recommend_article_out" data-mod="popu_387" data-poputype="feed" data-feed-show="false" data-dsm="post">
            <a href="https://blog.csdn.net/CSDN_LQR/article/details/54023261" target="_blank" strategy="BlogCommendFromBaidu_12">
                <dd>
                    <h2 style="margin-bottom: 0px;">解决RecyclerView局部刷新时闪烁</h2>
                    <ul class="floatR">
                        <li class="avatar_img"><img src="https://avatar.csdn.net/6/6/F/3_csdn_lqr.jpg" alt="CSDN_LQR" title="CSDN_LQR"></li>
                        <li class="user_name">CSDN_LQR</li>
                        <li class="time">2017年01月04日 19:42</li>
                        <li class="visited_num"><i class="icon iconfont icon-read"></i><span>4149</span></li>
                    </ul><div class="summary">
                        RecyclerView局部刷新是由于其自带的item动画造成的,相信都看过RecyclerView在移除某个item时的删除动画吧,这个闪烁也是默认动画中的效果,所以只要去掉默认动画里的闪烁效果问题...                        </div>


                </dd>
            </a>
        </dl>
                                                <dl class="clearfix csdn-tracking-statistics recommend_article recommend_article_out" data-mod="popu_387" data-poputype="feed" data-feed-show="false" data-dsm="post">
            <a href="https://blog.csdn.net/lzq520210/article/details/69253884" target="_blank" strategy="BlogCommendFromBaidu_13">
                <dd>
                    <h2 style="margin-bottom: 0px;">RecyclerView列表数据刷新</h2>
                    <ul class="floatR">
                        <li class="avatar_img"><img src="https://avatar.csdn.net/5/A/D/3_lzq520210.jpg" alt="lzq520210" title="lzq520210"></li>
                        <li class="user_name">lzq520210</li>
                        <li class="time">2017年04月05日 14:38</li>
                        <li class="visited_num"><i class="icon iconfont icon-read"></i><span>474</span></li>
                    </ul><div class="summary">
                        需求是这样的,一个RecyclerView列表数据,每一个item都有点赞功能,点击item进入详情页,详情页也可以点赞,在详情页点赞后,返回列表,要求刷新数据,是刷新某一个item的数据,不是所有的...                        </div>


                </dd>
            </a>
        </dl>
                                                <dl class="clearfix csdn-tracking-statistics recommend_article recommend_article_out" data-mod="popu_387" data-poputype="feed" data-feed-show="false" data-dsm="post">
            <a href="https://blog.csdn.net/sunyuntai/article/details/53954474" target="_blank" strategy="BlogCommendFromBaidu_14">
                <dd>
                    <h2 style="margin-bottom: 0px;">关于RecyclerView刷新</h2>
                    <ul class="floatR">
                        <li class="avatar_img"><img src="https://avatar.csdn.net/4/3/C/3_sunyuntai.jpg" alt="sunyuntai" title="sunyuntai"></li>
                        <li class="user_name">sunyuntai</li>
                        <li class="time">2016年12月31日 11:40</li>
                        <li class="visited_num"><i class="icon iconfont icon-read"></i><span>643</span></li>
                    </ul><div class="summary">
                        用SwipeRefreshLayout嵌套Recycler

下面是布局文件
 
        android:id=”@+id/swipeRefreshLayout”
        androi…

                </dd>
            </a>
        </dl>
                                                <dl id="_euoimy82ok"></dl><dl class="clearfix csdn-tracking-statistics recommend_article recommend_article_out" data-mod="popu_387" data-poputype="feed" data-feed-show="false" data-dsm="post">
            <a href="https://blog.csdn.net/zhangli_/article/details/70154476" target="_blank" strategy="BlogCommendFromBaidu_15">
                <dd>
                    <h2>添加或删除RecyclerView的item后 刷新Adapter中的数据源的个数</h2>
                    <div class="summary">
                        通常Recycler给Adapter赋上数据源的时候利用:adapter.notifyDataSetChanged();这样一般是在初始化界面 从网络获取到数据后 直接赋给adapter的写法。然后再...                        </div>

                    <ul>
                        <li class="avatar_img"><img src="https://avatar.csdn.net/F/E/F/3_zhangli_.jpg" alt="zhangli_" title="zhangli_"></li>
                        <li class="user_name">zhangli_</li>
                        <li class="time">2017年04月13日 10:12</li>
                        <li class="visited_num"><i class="icon iconfont icon-read"></i><span>2773</span></li>
                    </ul>
                </dd>
            </a>
        </dl>
                                                <dl class="clearfix csdn-tracking-statistics recommend_article recommend_article_out" data-mod="popu_387" data-poputype="feed" data-feed-show="false" data-dsm="post">
            <a href="https://blog.csdn.net/b14858856/article/details/52920164" target="_blank" strategy="BlogCommendFromBaidu_16">
                <dd>
                    <h2>Recyclerview使用notifyitemchanged方法会回到顶部</h2>
                    <div class="summary">
                        categories.get(lastPosition).setSelected(false);

categoryAdapter.notifyItemChanged(lastPosition);
ca…

                    <ul>
                        <li class="avatar_img"><img src="https://avatar.csdn.net/8/4/2/3_b14858856.jpg" alt="b14858856" title="b14858856"></li>
                        <li class="user_name">b14858856</li>
                        <li class="time">2016年10月25日 11:28</li>
                        <li class="visited_num"><i class="icon iconfont icon-read"></i><span>3974</span></li>
                    </ul>
                </dd>
            </a>
        </dl>
                                                <dl class="clearfix csdn-tracking-statistics recommend_article recommend_article_out" data-mod="popu_387" data-poputype="feed" data-feed-show="false" data-dsm="post">
            <a href="https://blog.csdn.net/jimdaxu/article/details/79582833" target="_blank" strategy="BlogCommendFromBaidu_17">
                <dd>
                    <h2 style="margin-bottom: 0px;">RecyclerView局部更新</h2>
                    <ul class="floatR">
                        <li class="avatar_img"><img src="https://avatar.csdn.net/7/8/6/3_jimdaxu.jpg" alt="jimdaxu" title="jimdaxu"></li>
                        <li class="user_name">jimdaxu</li>
                        <li class="time">2018年03月16日 15:58</li>
                        <li class="visited_num"><i class="icon iconfont icon-read"></i><span>24</span></li>
                    </ul><div class="summary">
                        局部更新两个步骤:1&nbsp;mAdapter.notifyItemChanged(position);2 重写adapter中的onBindViewHolder(RecyclerView.ViewHolde...                        </div>


                </dd>
            </a>
        </dl>
                                                <dl class="clearfix csdn-tracking-statistics recommend_article recommend_article_out" data-mod="popu_387" data-poputype="feed" data-feed-show="false" data-dsm="post">
            <a href="https://blog.csdn.net/bskfnvjtlyzmv867/article/details/71106123" target="_blank" strategy="BlogCommendFromBaidu_18">
                <dd>
                    <h2>Android框架之路——Glide加载图片(结合RecyclerView、CardView)</h2>
                    <div class="summary">
                        Android框架之路——Glide加载图片(结合RecyclerView、CardView)一、简介:

在泰国举行的谷歌开发者论坛上,谷歌为我们介绍了一个名叫 Glide 的图片加载库,作者是b…

                    <ul>
                        <li class="avatar_img"><img src="https://avatar.csdn.net/A/2/2/3_bskfnvjtlyzmv867.jpg" alt="bskfnvjtlyzmv867" title="bskfnvjtlyzmv867"></li>
                        <li class="user_name">bskfnvjtlyzmv867</li>
                        <li class="time">2017年05月03日 01:42</li>
                        <li class="visited_num"><i class="icon iconfont icon-read"></i><span>4258</span></li>
                    </ul>
                </dd>
            </a>
        </dl>
                                                <dl class="clearfix csdn-tracking-statistics recommend_article recommend_article_out" data-mod="popu_387" data-poputype="feed" data-feed-show="false" data-dsm="post">
            <a href="https://blog.csdn.net/qq_22770457/article/details/54095337" target="_blank" strategy="BlogCommendFromBaidu_19">
                <dd>
                    <h2>Android——实现酷炫的RecyclerView心形交错下拉刷新动画</h2>
                    <div class="summary">
                        最近好久没发博客了啊...虽然工作比较忙,但还是懈怠了。

本文介绍实现的一个带动效的RecyclerView下拉刷新动画,效果如下图:
 

实现原理:
基于Aspsine的上拉加载下拉刷新的Rec…

                    <ul>
                        <li class="avatar_img"><img src="https://avatar.csdn.net/9/C/1/3_qq_22770457.jpg" alt="qq_22770457" title="qq_22770457"></li>
                        <li class="user_name">qq_22770457</li>
                        <li class="time">2017年01月08日 16:31</li>
                        <li class="visited_num"><i class="icon iconfont icon-read"></i><span>2495</span></li>
                    </ul>
                </dd>
            </a>
        </dl>
                    </div>


等级:
访问量: 3万+
积分: 536
排名: 9万+
// 判断并设置用户名位置,没有博客专家与关注按钮时,用户名居中 medalschildren= m e d a l s c h i l d r e n = ('.medals').children().length; spanaddfollow= s p a n a d d f o l l o w = ('#span_add_follow').length; if( medals_children === 0 && medals_children === 0 && span_add_follow === 0){ $('.inf_bar dd').css('vertical-align','10px') }
                </div>
  <img class="append_mark_img" style="display:block;position:absolute;left:0;bottom:0;width:30px;height:16px" src="https://img-blog.csdnimg.cn/2022010622215378992.png"></div>
        <div class="writings">
  <div class="public_signal clearfix">
    <h3>博主最新文章</h3>
    <a href="https://blog.csdn.net/lf0814" target="_blank" class="more"><span>更多文章</span></a>
  </div>
    <ul class="inf_list clearfix csdn-tracking-statistics tracking-click" data-mod="popu_382">
                    <li class="clearfix">
            <a href="https://blog.csdn.net/lf0814/article/details/79217937" target="_blank">蓝牙(Bluetooth)设备通讯,并连接WIFI</a>
        </li>
                    <li class="clearfix">
            <a href="https://blog.csdn.net/lf0814/article/details/78951843" target="_blank">AndroidStudio3.0 Error:All flavors must now belong to a named flavor dimension</a>
        </li>
                    <li class="clearfix">
            <a href="https://blog.csdn.net/lf0814/article/details/78812655" target="_blank">Android 日历归档</a>
        </li>
                    <li class="clearfix">
            <a href="https://blog.csdn.net/lf0814/article/details/78552853" target="_blank">Android中事件传递机制的总结</a>
        </li>
                    <li class="clearfix">
            <a href="https://blog.csdn.net/lf0814/article/details/78549191" target="_blank">这可能是最快入门或最快熟悉RxJava2.x的教程</a>
        </li>
                </ul>
</div>
            <div class="user-hotArticle sort ClassSort">
        <h3>文章分类</h3>
        <ul class="hotArticle-list sort-list ClassSort-list" style="height: 190px; overflow-y: hidden;">
                                <li class="clearfix">
                    <a href="https://blog.csdn.net/lf0814/article/category/6140951" class="odd-overhidden floatL">View</a>
                    <div class="read list-left floatR"><span>9篇</span></div>
                </li>
                                <li class="clearfix">
                    <a href="https://blog.csdn.net/lf0814/article/category/6373892" class="odd-overhidden floatL">百度地图</a>
                    <div class="read list-left floatR"><span>1篇</span></div>
                </li>
                                <li class="clearfix">
                    <a href="https://blog.csdn.net/lf0814/article/category/6408352" class="odd-overhidden floatL">EaseUI</a>
                    <div class="read list-left floatR"><span>1篇</span></div>
                </li>
                                <li class="clearfix">
                    <a href="https://blog.csdn.net/lf0814/article/category/6475089" class="odd-overhidden floatL">RecycleView</a>
                    <div class="read list-left floatR"><span>1篇</span></div>
                </li>
                                <li class="clearfix">
                    <a href="https://blog.csdn.net/lf0814/article/category/6830266" class="odd-overhidden floatL">Android Studio Lambda</a>
                    <div class="read list-left floatR"><span>1篇</span></div>
                </li>
                                <li class="clearfix">
                    <a href="https://blog.csdn.net/lf0814/article/category/6842176" class="odd-overhidden floatL">人生-思想</a>
                    <div class="read list-left floatR"><span>2篇</span></div>
                </li>
                                <li class="clearfix">
                    <a href="https://blog.csdn.net/lf0814/article/category/6842202" class="odd-overhidden floatL">material-design</a>
                    <div class="read list-left floatR"><span>1篇</span></div>
                </li>
                                <li class="clearfix">
                    <a href="https://blog.csdn.net/lf0814/article/category/6906482" class="odd-overhidden floatL">异常</a>
                    <div class="read list-left floatR"><span>2篇</span></div>
                </li>
                                <li class="clearfix">
                    <a href="https://blog.csdn.net/lf0814/article/category/6915482" class="odd-overhidden floatL">支付</a>
                    <div class="read list-left floatR"><span>1篇</span></div>
                </li>
                                <li class="clearfix">
                    <a href="https://blog.csdn.net/lf0814/article/category/7108217" class="odd-overhidden floatL">开发环境</a>
                    <div class="read list-left floatR"><span>2篇</span></div>
                </li>
                                <li class="clearfix">
                    <a href="https://blog.csdn.net/lf0814/article/category/7231288" class="odd-overhidden floatL">android</a>
                    <div class="read list-left floatR"><span>4篇</span></div>
                </li>
                                <li class="clearfix">
                    <a href="https://blog.csdn.net/lf0814/article/category/7279507" class="odd-overhidden floatL">Java</a>
                    <div class="read list-left floatR"><span>1篇</span></div>
                </li>
                                <li class="clearfix">
                    <a href="https://blog.csdn.net/lf0814/article/category/7291391" class="odd-overhidden floatL">RxJava</a>
                    <div class="read list-left floatR"><span>2篇</span></div>
                </li>
                        </ul>
        <div class="unfold-btn">
          <span>展开</span><i class="icon iconfont icon-xiajiantou"></i>
        </div>
    </div>
<!--    [StartShowSelfColumn]-->
<!--    [EndShowSelfColumn]-->
        <div class="user-hotArticle sort timeSort">
      <h3>文章存档</h3>
      <ul class="hotArticle-list timeSort-list" style="height: 190px; overflow-y: hidden;">
                        <li class="clearfix">
              <a href="https://blog.csdn.net/lf0814/article/month/2018/01" class="odd-overhidden floatL">2018年1月</a>
              <div class="read list-left floatR"><span>2篇</span></div>
            </li>
                        <li class="clearfix">
              <a href="https://blog.csdn.net/lf0814/article/month/2017/12" class="odd-overhidden floatL">2017年12月</a>
              <div class="read list-left floatR"><span>1篇</span></div>
            </li>
                        <li class="clearfix">
              <a href="https://blog.csdn.net/lf0814/article/month/2017/11" class="odd-overhidden floatL">2017年11月</a>
              <div class="read list-left floatR"><span>4篇</span></div>
            </li>
                        <li class="clearfix">
              <a href="https://blog.csdn.net/lf0814/article/month/2017/10" class="odd-overhidden floatL">2017年10月</a>
              <div class="read list-left floatR"><span>2篇</span></div>
            </li>
                        <li class="clearfix">
              <a href="https://blog.csdn.net/lf0814/article/month/2017/08" class="odd-overhidden floatL">2017年8月</a>
              <div class="read list-left floatR"><span>3篇</span></div>
            </li>
                        <li class="clearfix">
              <a href="https://blog.csdn.net/lf0814/article/month/2017/07" class="odd-overhidden floatL">2017年7月</a>
              <div class="read list-left floatR"><span>1篇</span></div>
            </li>
                        <li class="clearfix">
              <a href="https://blog.csdn.net/lf0814/article/month/2017/06" class="odd-overhidden floatL">2017年6月</a>
              <div class="read list-left floatR"><span>2篇</span></div>
            </li>
                        <li class="clearfix">
              <a href="https://blog.csdn.net/lf0814/article/month/2017/05" class="odd-overhidden floatL">2017年5月</a>
              <div class="read list-left floatR"><span>5篇</span></div>
            </li>
                        <li class="clearfix">
              <a href="https://blog.csdn.net/lf0814/article/month/2017/04" class="odd-overhidden floatL">2017年4月</a>
              <div class="read list-left floatR"><span>2篇</span></div>
            </li>
                        <li class="clearfix">
              <a href="https://blog.csdn.net/lf0814/article/month/2017/03" class="odd-overhidden floatL">2017年3月</a>
              <div class="read list-left floatR"><span>1篇</span></div>
            </li>
                        <li class="clearfix">
              <a href="https://blog.csdn.net/lf0814/article/month/2017/02" class="odd-overhidden floatL">2017年2月</a>
              <div class="read list-left floatR"><span>1篇</span></div>
            </li>
                        <li class="clearfix">
              <a href="https://blog.csdn.net/lf0814/article/month/2016/10" class="odd-overhidden floatL">2016年10月</a>
              <div class="read list-left floatR"><span>1篇</span></div>
            </li>
                        <li class="clearfix">
              <a href="https://blog.csdn.net/lf0814/article/month/2016/09" class="odd-overhidden floatL">2016年9月</a>
              <div class="read list-left floatR"><span>1篇</span></div>
            </li>
                        <li class="clearfix">
              <a href="https://blog.csdn.net/lf0814/article/month/2016/08" class="odd-overhidden floatL">2016年8月</a>
              <div class="read list-left floatR"><span>1篇</span></div>
            </li>
                        <li class="clearfix">
              <a href="https://blog.csdn.net/lf0814/article/month/2016/03" class="odd-overhidden floatL">2016年3月</a>
              <div class="read list-left floatR"><span>1篇</span></div>
            </li>
                  </ul>
      <div class="unfold-btn">
        <span>展开</span><i class="icon iconfont icon-xiajiantou"></i>
      </div>
    </div>
        <div class="user-hotArticle">
    <h3>博主热门文章</h3>
    <ul class="hotArticle-list csdn-tracking-statistics tracking-click" data-mod="popu_521">






  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值