Ale*_*zis 2 android android-recyclerview
我有一个带有 RecyclerView 的 Fragment。它可以作为聊天使用。
我向后端请求最后 50 条消息,并将它们加载到回收站视图中
LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
layoutManager.setStackFromEnd(true);
recyclerView.setLayoutManager(layoutManager);
mAdapter = new ChatMessagesAdapter(recyclerView, messages, getActivity());
recyclerView.setAdapter(mAdapter);
recyclerView.getLayoutManager().scrollToPosition(messages.size()-1);
mAdapter.notifyDataSetChanged();
Run Code Online (Sandbox Code Playgroud)
然后,当我向上滚动时,我使用 OnScrollListener 请求更多消息并加载它们
messages.addAll(0, oldMessages);
mAdapter.notifyDataSetChanged();
mAdapter.setLoaded();
recyclerView.getLayoutManager().scrollToPosition((oldMessages.size()) -1);
Run Code Online (Sandbox Code Playgroud)
但是当我在第一次加载时设置了 recyclerView
layoutManager.setStackFromEnd(true);
Run Code Online (Sandbox Code Playgroud)
当我加载旧消息时,滚动将显示的第一个项目(在最后一个之前)移动到底部。
如何在顶部添加旧消息并继续滚动,就像第一次加载时项目就在那里一样?不将焦点移到底部
使用notifyItemRangeInserted而不是notifyDataSetChanged。
使用以下代码更新您的适配器:
public void addList(List<ChatMessage> items) {
chatMessages.addAll(0, items);
notifyItemRangeInserted(0,items.size());
notifyItemChanged(items.size());//Only To update the last top item cause in my case it was the date header so i need to notify it
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2559 次 |
| 最近记录: |