RecyclerView在顶部添加项目并继续滚动

时间:2017-10-16 10:45:05

标签: android android-recyclerview

我有一个带有RecyclerView的片段。它可以作为聊天工作。

我向后端请求最后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();

然后,当我向上滚动时,我使用OnScrollListener请求更多消息并加载它们

messages.addAll(0, oldMessages);
mAdapter.notifyDataSetChanged();
mAdapter.setLoaded();
recyclerView.getLayoutManager().scrollToPosition((oldMessages.size()) -1);

但是当我在第一次加载

时设置了recyclerView
layoutManager.setStackFromEnd(true);

当我加载旧消息时,滚动会将显示的第一个项目(在最后一个之前)移动到底部。

如何在顶部添加旧邮件并继续滚动,就像第一次加载项目一样?没有将焦点移到底部

1 个答案:

答案 0 :(得分:4)

使用 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 
}