使用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);//滚动到数据最后一列


下面放出一张效果图,啊哈哈:


猜你喜欢

转载自blog.csdn.net/a295268305/article/details/80713727
今日推荐