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

时间:2014-11-19 12:12:25

标签: android android-recyclerview

我使用Recyclerview替换列表视图 我想保持Recyclerview始终向下滚动。

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

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

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

5 个答案:

答案 0 :(得分:41)

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

答案 1 :(得分:35)

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

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

e.g。适配器位置0位于底部,1位于其上方等...

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

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

答案 2 :(得分:4)

我遇到了同样的问题,我使用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);
    }
 }
});

容易!

答案 3 :(得分:3)

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

答案 4 :(得分:0)

我也面临同样的问题。但是下面的代码帮助了我。我希望这很有用。

在这个staus是arraylist。

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

下一个是: - 在此您可以使用适配器类

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