使用RecyclerView 调用notifyDataSetChanged不起作用解决办法
今天在做即时通讯的时候碰到碰到一个问题,特此记录下:
问题如下: 对方发来消息,我接收消息后没有及时刷新页面(数据不显示)
我仔细检查了一下代码,发现我调用了notifyDataSetChanged刷新方法啊。按理说没问题啊!
接着我就发现,你的数据虽然没有第一时间在屏幕上显示,但是你用手去滑动屏幕的时候,数据就会加载出来。
这就说明了他是走了notifyDataSetChanged方法的。
紧接着,我就想,你手滑动的时候不就是屏幕滑动啊,我让数据滑动到最底部就不好了吗。
然后我就改成这样
添加数据后让recycleview滚动到屏幕最后一行,讲道理这样应该就可以了吧。
发现还是不行,于是我将滚动方法改了一下。
结果发现是起作用了,说明他们两者还是有区别的,下面会说到。
但是后来发现填充第一条的数据的没有作用,不走这个方法,只有第二、第三、第...有用。
于是我又添加了
recyclerView.setHasFixedSize(true);
发现起作用了,最终完美解决了数据不刷新问题。
区别:smoothScrollToPosition和scrollToPosition
smoothScrollToPosition(position)和scrollToPosition(position)效果基本相似,也是把你想显示的项显示出来,只要那一项现在看得到了,那它就罢工了,不同的是smoothScrollToPosition是平滑到你想显示的项,而scrollToPosition是直接定位显示!
总结
1、设置相关属性
recyclerView.setHasFixedSize(true);这句话的是意思使recyclerView保持固定的大小。如果可以确定每个item的高度是固定的,设置这个选项可以提高性能。
2、填充数据后刷新数据(使用notifyItemInserted,而不是notifyDataSetChanged)
notifyItemInserted(int position)
3、指定滚动位置(使用smoothScrollToPosition,而不是scrollToPosition)
recyclerView.smoothScrollToPosition(adapter.getItemCount() - 1);//滚动到数据最后一列
下面放出一张效果图,啊哈哈: