項目中涉及聊天功能终抽,原本需求是如果有新消息纪他,不管是否在看歷史消息,直接滾動到底部:
mRecyclerView.scrollToPosition(list.size() - 1);
但后來客戶發(fā)現(xiàn)很不友好耻煤,于是讓產(chǎn)品改成具壮,如果用戶在看歷史消息就不強制滾到底部。我實現(xiàn)的方式是如果新消息到了哈蝇,會判斷RecyclerView是否還能向下滑動棺妓,如果能就不滾到底部:
if(mRecyclerView.canScrollVertically(1)){
//還可以向上滑動(還沒到底部)
}else{
//滑動到底部了
}
這邊順帶說明下如果要判斷是否在頂部:
if(mRecyclerView.canScrollVertically(-1)){
//還可以向下滑動(還沒到頂部)
}else{
//滑動到頂部了
}
但是這么寫在測試中發(fā)現(xiàn),在滾到底部后炮赦,有時候新消息到了怜跑,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數(shù)量太少 , 就會出現(xiàn)RecyclerView頂部空了很多空白出來 , 所以需要將RecyclerView的高度設置為 wrap_content植锉。
linearLayoutManager.scrollToPositionWithOffset(mAdapter.getItemCount() - 1, Integer.MIN_VALUE);
這個方法是定位到指定項如果該項可以置頂就將其置頂顯示,這樣問題就解決啦峭拘!