在键盘打开时将项目添加到 RecyclerView 时向下滚动

Posted

技术标签:

【中文标题】在键盘打开时将项目添加到 RecyclerView 时向下滚动【英文标题】:Scroll down when adding item to RecyclerView while keyboard is open 【发布时间】:2020-06-09 03:34:20 【问题描述】:

当我添加一个新的列表项时,键盘仍然打开,列表项出现在键盘后面,因此是不可见的。如何自动向下滚动以使其可见?

请记住,我已经解决了以下问题:

打开键盘时,滚动 RecyclerView 以使最后一项可见:已解决

剩下的最后一个问题是键盘已经打开。当我第一次打开键盘时它工作正常。当我点击“发送”时,该项目被添加到键盘后面并且当我希望它向上滚动时

    我点击“发送消息”

    这就是发生的事情。它隐藏在键盘后面

【问题讨论】:

https://***.com/a/59471300/6253847 Marat 的回答是我遇到的最简单的。 @SammyT 将反向布局设置为 true 只会使消息以错误的顺序显示。即使我将传入的列表项设置为以其他顺序进入以弥补这一点并使它们以正确的顺序出现 - 它也不能解决问题。 我有一个 RecyclerView,我最近一直在研究它,它完美地工作。是的,您必须颠倒数据集的顺序,但视图与底部边缘保持对齐。除了反转布局之外,您还滚动到位置吗? 是的,我都试过了,但问题仍然存在。 如果你反转布局,你不需要滚动到位置。 【参考方案1】:

将您的 LayoutManager 设置为反向布局,以使 RecyclerView 保持其定位在其底部边缘而不是顶部边缘:

LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setReverseLayout(true);
myRecycler.setLayoutManager(layoutManager);

应该不再需要自动滚动到适配器的最后一个位置,因此,如果您以前有这样做的代码,则应该将其删除。

您还必须反转适配器中数据集的顺序以匹配您最初的顺序(如果您的数据最初是按升序排序的,那么您应该将其更改为降序)。 对于您的情况,您可能希望按降序时间排序,以便将最近的项目排列在 RecyclerView 的底部,最旧的排列在顶部。

而且,如果你直接添加到适配器的数据集,你应该添加到适配器列表的开头:

myDataList.add(0, myNewItem); // Add to the beginning of the list shifting previous items over
notifyDataSetChanged(); // Notify the adapter to refresh

【讨论】:

以上是关于在键盘打开时将项目添加到 RecyclerView 时向下滚动的主要内容,如果未能解决你的问题,请参考以下文章

当actionmode打开时,RecyclerView子项不会单击

键盘打开时TextInput不可见Expo React Native

StatefulWidget 页面在键盘打开时重新创建

iOS webview自动对焦在键盘打开时不起作用

移动网络 - 如何在键盘打开时获取屏幕高度

键盘打开时如何固定小部件布局?