由于项目需要用到显示历史聊天记录,要求用户下拉时自动在RecyclerView顶部加载以前的聊天记录,并且尽可能的平滑加载数据。
常规做法是调用RecyclerView 的notifyDataSetChanged()方法,再调用scrollToPosition滚动到最后一条记录的底部,也就是停留在新加载的数据最后一条记录所在位置。
实际测试发现,这样无法做到平滑连续加载,因为在加载新数据后,RecyclerView总是需要滚动到最新数据的底部,此时用户可能正在看着某条记录,如果我们突然滚动到最新加载的数据底部,那就相当于用户还没看完你就给他翻页了,体验就会变差~
经过一番尝试,发现RecycleView还有个方法:findLastCompletelyVisibleItemPosition(),可以获取到RecycleView最后一个可见item的位置,这个方法很有用,因为只要记录下加载数据前的最后一个可见item位置,notifyDataSetChanged()后再滚动到这个item的位置,看起来页面数据加载就是连贯的,基本不会感觉界面抖动,从而提升用户体验。