当 EditText 增长时 ListView 滚动到顶部

Posted

技术标签:

【中文标题】当 EditText 增长时 ListView 滚动到顶部【英文标题】:ListView Scrolls to Top when EditText Grows 【发布时间】:2017-09-14 15:21:33 【问题描述】:

我在每个单元格中都有一个ListviewEditTexts。每当我将文本添加到 EditText 增长 1 行时,ListView 就会滚动到顶部(并且通常会通过这样做从视图中删除 EditText)。

我发现了一些关于此的问题,但他们似乎只有“黑客”作为答案,没有什么对我有用。

ListView scrolls to top when typing in multi-line EditText

Listview with edittext - auto scroll on "next"

编辑: 经过大量研究,我发现这是因为editText正在调整大小,导致ListView布局其子视图然后重置到顶部。我想找到一种方法让 EditText 在原地保持增长。

我尝试这个是因为我在网上找到了一个建议,但是,即使它使ListView 保持在正确的高度,它也会从EditText 中清除焦点,我似乎无法用requestFocus 找回它。

private Stirng getTextWatcher()
return new TextWatcher()
@Override public void beforeTextChanged(CharSequence s, int start, int count, int after) 
@Override public void onTextChanged(CharSequence s, int start, int before, int count)  
@Override public void afterTextChanged(Editable s)  
listView.setSelection(index);
  
 

所以我需要的是:

    有办法让ListView 在再次布局子视图时不会自动滚动到顶部,或者

    一种在调用ListView.setSelected() 或 3 后聚焦EditText 的方法。还有另一种滚动ListView 的方法,它不会从EditText 清除焦点。

对于选项

    我已经尝试过scrollTo()smoothScrollToPosition()scrollTo 出于某种原因有效,但从ListView 中隐藏了某些项目(它们变得不可见,未加载)。 smoothScrollToPosition() 创建一个动画,其中 ListView 跳到顶部,然后将用户带回项目(并执行 2 或 3 次)。

【问题讨论】:

你能发布你的代码吗?为什么这些答案对你不起作用? @legendof 发布我的代码是为了什么?列表视图?这对我来说似乎很标准。没什么特别的。除了在 XML 中填充它之外,我在 java 中没有对它做任何事情。我的意思是所有这些都是黑客,我想要一些优雅和高效的东西......而不是像“每次添加字母时滚动列表视图” 你能给我们看看 XML 布局吗?列表视图的代码,以及它的父母。是不是碰巧在 ScrollView 里面? 【参考方案1】:

按照我的观点,如果您想通过使用EditTextListView 项目中获取输入,那么您应该使用TextView 代替EdiText 并通过单击TextView 您应该打开并使用@ 输入对话框987654326@ 那是更简单和更好的解决方案。处理 ListView 中的 EditText 焦点非常困难,您需要为此添加额外的 Listeners

如果您的 UI/UX 中的输入框数量有限,那么您可以使用 ScrollViews 实现 EditTextCustomListView

【讨论】:

我刚刚测试了你的方法。第二个对我来说完美无缺。我所做的是在滚动视图中使用线性布局,并以编程方式在 java 中插入我的视图。它工作得很好,当编辑文本增长时,滚动视图保持在它的位置。谢谢。【参考方案2】:

EditText 增长时ListView 滚动到顶部

ListView 有一些与儿童焦点相关的已知限制。

解决方案

为什么不尝试使用RecyclerView 而不是ListView? Google 引入了RecyclerView 作为此类 UI 的默认推荐方式。所以自定义ListView 或黑客不再需要。

【讨论】:

同样的情况也发生在 RecyclerView 上。 ***.com/questions/36765265/…【参考方案3】:

您可以尝试将此属性添加到您的ListView

android:transcriptMode="normal"

这会使列表在收到数据集更改通知时自动滚动到底部,并且仅当最后一项已在屏幕上可见时。

在此处阅读更多信息:attr_android:transcriptMode | Android Developers

【讨论】:

以上是关于当 EditText 增长时 ListView 滚动到顶部的主要内容,如果未能解决你的问题,请参考以下文章

ListView 与 EditText 键盘问题

在 ListView 中看起来像 TextView 的 EditText

Android 中listview中嵌套edittext问题

listview中的item是自定义的含有textview和edittext 还有button 点击listview外的按钮增加一个item问题

如何使用“自动调整大小”避免 Android 中的小部件重叠。

关于最下方 EditText 获取焦点 界面上移的问题