使用RecyclerView遇到notifyDataSetChanged无效

来源:互联网 发布:jsp和javascript的用途 编辑:程序博客网 时间:2024/06/15 18:08

             最近项目里集成了环信的即时通讯,现在有这么一个需求,当收到消息时,动态更新整个消息列表的总的未读消息数。效果图如下:

                     

          看看我之前的代码,在消息监听的回调直接调用adapter.setData( getP().loadConversationList()),

                     

        再来看下adapter.setData(getP().loadConversationList())方法:

                     

        其实就是在里面直接调用了notifyDataSetChanged(),此时有消息来时,界面并没有被刷新,于是我debug跟踪了一下代码的调用逻辑,发现在调用adapter.setData(getP().loadConversationList())里的notifyDataSetChanged()后并没有接着调用onCreateViewHolder()和onBindViewHolder()这两个方法。为什么没有调用者这两个方法,我一时半会不知所措了,于是去网上找资料,发现可能我调用adapter.setData(getP().loadConversationList())方法并不是在主线程调用的,因为之前没有在主线程更新UI,运行时都会报错,这次并没有报错。于是我修改了代码如下:

                     


                                   

        运行后,notifyDataSetChanged()奏效了,界面刷新了。
        或者用runOnUIThread()/view.post(rannable)代替Handler也可以。
        总结:这个坑很深,要不是在网上看了前辈们的资料,确实很难填满这个坑,如果遇到notifyDataSetChanged()无效,请检查是否在主线程调用的!
阅读全文
1 0
原创粉丝点击