对可能具有误导性的标题表示道歉,但我不知道如何说出来。如果其他人认为他们可以提出更好的东西,请随时编辑。
我有一个RecyclerView,我用Firebase记录填充。为了使最新记录显示在列表顶部,我按照建议here将我的RecvlerView设置为setReverseLayout(true)
和setStackFromEnd(true)
。当项目数量适合屏幕空间时,这非常有效 - 其余项目可以平滑地向下滚动,为淡入的新项目留出空间,如下所示。
问题是当现有物品占用所有屏幕空间时,新物品被添加到其他物品的“上方”并且RecyclerView有效地扩展到屏幕顶部之上,因此要查看我需要拉动的新物品或手动滚动列表。下面是另一个GIF;
我怎样才能克服这个?
答案 0 :(得分:4)
final int SCROLLING_UP = -1;
boolean scrollToNewTop = !recyclerView.canScrollVertically(SCROLLING_UP);
//TODO update adapter here
adapter.notifyItemInserted(adapter.getItemCount() - 1);
if (scrollToNewTop) {
recyclerView.scrollToPosition(adapter.getItemCount() - 1);
}
如果你处于最顶层,这会将你滚动起来,如果你处于中间某个地方,可以保持一切不受欢迎的跳跃。
答案 1 :(得分:1)
这可能有所帮助:
adapter.notifyItemInserted(position);
recyclerView.scrollToPosition(position);
答案 2 :(得分:0)
mAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
@Override
public void onItemRangeInserted(int positionStart, int itemCount) {
super.onItemRangeInserted(positionStart, itemCount);
int testimonycount = mAdapter.getItemCount();
int lastVisiblePosition =
linearLayoutManager.findLastCompletelyVisibleItemPosition();
// If the recycler view is initially being loaded or the
// user is at the bottom of the list, scroll to the bottom
// of the list to show the newly added message.
if (lastVisiblePosition == -1 ||
(positionStart >= (testimonycount - 1) &&
lastVisiblePosition == (positionStart - 1))) {
recipeRecyclerview.scrollToPosition(positionStart);
}
}