项目中涉及聊天功能,原本需求是如果有新消息,不管是否在看历史消息,直接滚动到底部:
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);
这个方法是定位到指定项如果该项可以置顶就将其置顶显示,这样问题就解决啦!
网友评论