【问题标题】:how to keep RecyclerView always scroll bottom如何让 RecyclerView 始终滚动到底部
【发布时间】:2014-11-19 12:12:25
【问题描述】:

我使用 Recyclerview 替换为列表视图 我想让 Recyclerview 始终滚动到底部。

ListView可以使用这个方法setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL)

RecyclerView我使用方法smoothScrollToPosition(myAdapter.getItemCount() - 1)

但是当软键盘 Pop 时,它会替换 RecyclerView 的内容。

【问题讨论】:

  • 你最后解决问题了吗?我发现setReverseLayout为true会导致item从上到下显示,不适合聊天。
  • 你可以试试我的回答:stackoverflow.com/a/43647835/6482350

标签: android android-recyclerview


【解决方案1】:

如果您想将滚动位置保持在RecyclerView 的底部,它在聊天应用程序中很有用。只需在LinearLayoutManager 上调用setStackFromEnd(true) 即可使键盘将列表项固定在底部(键盘)而不是顶部。

【讨论】:

  • 只对我第一次工作......是的,我正在制作一个聊天应用程序
  • 这行得通。在 xml 文件中设置这个不起作用。
  • @larrytech 从应该在LinearLayoutManager 上调用的答案中不清楚吗?
  • 它不起作用。它被反转了,但它不会滚动到底部。
【解决方案2】:

这是因为 RV 认为它的参考点是 TOP,当键盘启动时,RV 的大小由父级更新,并且 RV 保持其参考点稳定。 (从而保持顶部位置在同一位置)

您可以将 LayoutManager#ReverseLayout 设置为 true,在这种情况下,RV 将从适配器的末尾开始布局项目。

例如适配器位置 0 位于底部,1 位于其上方,依此类推...

这当然需要您颠倒适配器的顺序。

我不确定,但设置 stack from end 也可能会在不重新排序适配器的情况下为您提供相同的结果。

【讨论】:

  • 谢谢,你解决了我的问题。我使用 reverseLayout 参数
  • 布局内容颠倒了,但列表没有滚动到最后。甚至 stackFromBottom 也无济于事。
  • 只是一个补充:有时在 XML 中设置 stackFromEnd在代码上调用该方法时起作用。
  • 如果你同时设置了 stackFromEnd=true 和 setReverseLayout=true 它就不起作用。有谁知道任何解决方法?
  • mLinearLayoutManager.setStackFromEnd(true);确实有助于键盘打开修复recyclerView ..谢谢伙计.. :)
【解决方案3】:

我遇到了同样的问题,我使用提到的方法解决了它here。用于检测软键盘是否打开,如果打开则调用smoothScrollToPosition()方法。

一个更简单的解决方案是为您的活动的根视图提供一个已知 ID,例如“@+id/activityRoot”,将 GlobalLayoutListener 挂钩到 ViewTreeObserver,然后从那里计算您的活动的视图根和窗口大小之间的大小差异:

final View activityRootView = findViewById(R.id.activityRoot);
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
    int heightDiff = activityRootView.getRootView().getHeight() - activityRootView.getHeight();
    if (heightDiff > 100) { 
        recyclerView.smoothScrollToPosition(myAdapter.getItemCount() - 1);
    }
 }
});

简单!

【讨论】:

  • 这在此页面上的所有答案中效果最好,但是,当您实现代码时,请务必检查 myAdapter.getItemCount() > 0 否则,当应用程序启动时列表中没有项目时,它会崩溃,因为它试图滚动到位置 -1
【解决方案4】:
recyclerView.scrollToPosition(getAdapter().getItemCount()-1);

【讨论】:

  • 当用户向上滚动一点并希望最后一个可见项目保持不变时,这不起作用。
【解决方案5】:

我也遇到了同样的问题。但是以下代码对我有帮助。我希望这很有用。

在这个状态是arraylist。

 recyclerView.scrollToPosition(staus.size()-1);

下一个是:- 在这你可以使用适配器类

   recyclerView.scrollToPosition(showAdapter.getItemCount()-1);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    相关资源
    最近更新 更多