Android RecyclerView滚动到底部不彻底问题

项目中涉及聊天功能,原本需求是如果有新消息,不管是否在看历史消息,直接滚动到底部:

mRecyclerView.scrollToPosition(list.size() - 1);

但后来客户发现很不友好,于是让产品改成,如果用户在看历史消息就不强制滚到底部。我实现的方式是如果新消息到了,会判断RecyclerView是否还能向下滑动,如果能就不滚到底部:

if(mRecyclerView.canScrollVertically(1)){
//还可以向上滑动(还没到底部)
}else{
//滑动到底部了
}

这边顺带说明下如果要判断是否在顶部:

if(mRecyclerView.canScrollVertically(-1)){
//还可以向下滑动(还没到顶部)
}else{
//滑动到顶部了
}

但是这么写在测试中发现,在滚到底部后,有时候新消息到了,RecycleView有时候并没有滚到底部,会有点偏差,这导致后面的消息到了不会自动滚到底部。

解决方法:

 LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
 linearLayoutManager.setStackFromEnd(true);
 linearLayoutManager.scrollToPositionWithOffset(mAdapter.getItemCount() - 1, Integer.MIN_VALUE);

 mRecyclerView.setLayoutManager(linearLayoutManager);

关键代码是:

 linearLayoutManager.setStackFromEnd(true);

这个方法是让先添加的item会被顶上去,最新添加的item每次都会显示在最下面 。但如果Item数量太少 , 就会出现RecyclerView顶部空了很多空白出来 , 所以需要将RecyclerView的高度设置为 wrap_content。

 linearLayoutManager.scrollToPositionWithOffset(mAdapter.getItemCount() - 1, Integer.MIN_VALUE);

这个方法是定位到指定项如果该项可以置顶就将其置顶显示,这样问题就解决啦!

你可能感兴趣的:(Android RecyclerView滚动到底部不彻底问题)