setReverseLayout中的RecyclerView滚动到顶部(或底部)

时间:2017-02-12 12:46:41

标签: android android-recyclerview

对可能具有误导性的标题表示道歉,但我不知道如何说出来。如果其他人认为他们可以提出更好的东西,请随时编辑。

我有一个RecyclerView,我用Firebase记录填充。为了使最新记录显示在列表顶部,我按照建议here将我的RecvlerView设置为setReverseLayout(true)setStackFromEnd(true)。当项目数量适合屏幕空间时,这非常有效 - 其余项目可以平滑地向下滚动,为淡入的新项目留出空间,如下所示。

Good

问题是当现有物品占用所有屏幕空间时,新物品被添加到其他物品的“上方”并且RecyclerView有效地扩展到屏幕顶部之上,因此要查看我需要拉动的新物品或手动滚动列表。下面是另一个GIF;

Bad

我怎样才能克服这个?

3 个答案:

答案 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);
            }
        }