如何保持RecyclerView始终滚动到底部

lj *_*ang 39 android android-recyclerview

我使用Recyclerview替换列表视图我想保持Recyclerview始终滚动到底部.

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

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

但是当软键盘弹出时,它取代了RecyclerView的内容.

Kir*_*kov 43

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

  • 仅对我第一次起作用...是的,我正在制作一个聊天应用程序 (2认同)

yig*_*git 36

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

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

例如,适配器位置0位于底部,1位于其上方等...

这当然要求您颠倒适配器的顺序.

我不确定但是从最后设置堆栈也可能会给你相同的结果,无需重新排序你的适配器.

  • 布局内容相反,但列表没有滚动到最后.甚至stackFromBottom都没有帮助. (14认同)

Kri*_*ndi 5

我遇到了同样的问题,我使用这里提到的方法解决了它。用于检测软键盘是否打开,如果打开则调用该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);
    }
 }
});
Run Code Online (Sandbox Code Playgroud)

简单!


jun*_*xia 5

recyclerView.scrollToPosition(getAdapter().getItemCount()-1);
Run Code Online (Sandbox Code Playgroud)