键盘打开时,滚动RecyclerView相应地查看

时间:2017-11-24 12:20:08

标签: android scroll android-recyclerview android-edittext keyboard

我创建了一个聊天活动,就像facebook messenger一样,底部有一个EditText,上面是RecyclerView的消息。当键盘打开时,我想要向上滚动RecyclerView,确切地向上滚动多少。更具体地说,假设RecyclerView中有5条消息,当前第3条消息就在EditText上方。因此,当键盘打开时,我想像之前一样在EditText上方保留第三条消息。我搜索过但找不到。如果这是一个重复的问题,如果有人能提供链接,我将不胜感激。

7 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,我所做的是当键盘打开时,我将recyclerView滚动到recyclerView中的最后一项,因此不会隐藏任何项目。我认为这比你提出的方式容易得多。 所以代码如下:

  recyclerView.postDelayed(new Runnable() {
            @Override
            public void run() {
                recyclerView.scrollToPosition(recyclerView.getAdapter().getItemCount() - 1);
            }
        }, 300);

答案 1 :(得分:0)

在您的清单中写下

    <activity
        android:name=".yourActivity"
        android:windowSoftInputMode="adjustResize" >
    </activity>

答案 2 :(得分:0)

试试这个

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.scrollToPosition(yourPosition);

答案 3 :(得分:0)

recyclerView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
        @Override
        public void onLayoutChange(View view, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
            if ( bottom < oldBottom) {
                recyclerView.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        recyclerView.scrollToPosition(adapter.getItemCount());
                    }
                }, 100);
            }
        }
    });

如果不起作用,请使用 smoothScrollToPosition 而不是 scrollToPosition

这对我有用。

答案 4 :(得分:0)

最新答案,但也许有人会觉得有用。

如果它是一个聊天应用程序,那么我想您想从底部开始构建列表。例如,有一个空聊天,添加了几则消息后,您希望它们位于列表的底部。稍后,随着越来越多的消息,较旧的消息将上升,而较新的消息将在EditText上方的底部。

假设最新消息位于列表/数组的第一位,则可以将LinearLayoutManager设置为反向布局。

layoutManager.reverseLayout = true

我无法解释原因,但看起来RecyclerView总是试图保留顶部边框的滚动位置。因此,当显示键盘时,可用的垂直空间会缩小,RecyclerView只会尝试使其顶部保持与以前相同。通过使其反向布局,您可以实现所需的行为。

答案 5 :(得分:0)

我遇到了同样的问题,我不想设置 windowSoftInputMode为“ adjustResize”。上面的答案对我不起作用。

editText.clearFocused();
hideKeyboard();

// update your adapter ... 

parent.requestLayout();

重置父布局的焦点,recylerView将正确更新。

答案 6 :(得分:0)

我一直在寻找正确的解决方案,但我发现了。

当您将recyclerview放在ConstraintLayout内时,以这种方式可以轻松地将recyclerview正确地相对于其他视图(在您的情况下是您的edittext)放置,

这曾经是我的布局xml,在这里它不起作用(我在LinearLayoutManager上为reverseLayout = true):

<androidx.constraintlayout.widget.ConstraintLayout>

  <RecyclerView
    android:id="@+id/recyclerView"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    app:layout_constraintBottom_toTopOf="@id/editText"
    app:layout_constraintTop_toBottomOf="parent" />

  <EditText
    android:id="@+id/editText"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:layout_constraintBottom_toBottomOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

在这种布局下,每次我通过按下EditText打开或关闭键盘时,滚动位置都会稍微向上移动。

我通过不使用ConstraintLayout对其进行了修复,而是将其替换为良好的旧RelativeLayout,如下所示:

<RelativeLayout>

  <RecyclerView
    android:id="@+id/recyclerView"
    android:layout_width="match_parent"
    android:layout_above="@id/editText"
    android:layout_height="match_parent" <!-- This is important, with 0dp it still doesnt work  -->
     />

  <EditText
    android:id="@+id/editText"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true" />

</RelativeLayout>

将RecyclerView高度设置为match_parent时,它将起作用。 (我们使用RelativeLayout的原因是,在ConstraintLayout上,您无法将layouth_height设置为子视图的match_parent,如果这样做,它将无法正常工作。)