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