当 EditText 增长时,ListView 会滚动到顶部



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

我发现了一些关于这个问题的问题,但他们似乎只有"黑客"作为答案,对我没有任何用处。

列表视图在多行编辑文本中键入时滚动到顶部

带有编辑文本的列表视图 - 自动滚动"下一步">

编辑: 经过大量研究,我发现这是因为 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);
}
}
}

所以我需要的是:

  1. 有一种方法可以让ListView在再次布局子视图时不会自动滚动到顶部,或者

  2. 一种在打电话后集中EditText的方法ListView.setSelected()或 3.有另一种方法来滚动ListView,该不会从EditText中清除焦点。

对于选项

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

如果您想使用EditTextListView项目中获取输入,那么您应该就地使用TextViewEdiText,然后单击TextView您应该打开输入对话框,EditText更简单,更好的解决方案。 在ListView中处理EditText焦点是多种困难的,您需要为此付出额外的Listeners

如果您的 UI/UX 中的输入框数量有限,则可以使用CustomListView实现EditTextScrollViews

当 EditText 增长时,ListView 会滚动到顶部

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

溶液

你为什么不尝试使用RecyclerView而不是ListView? 谷歌引入了RecyclerView作为此类UI的默认推荐方式。因此,不再需要定制ListView或黑客矿石。

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

android:transcriptMode="normal"

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

在此处阅读更多内容: attr_android:转录模式 |安卓开发者

最新更新