我有一个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);
}
}
}
所以我需要的是:
有一种方法可以让
ListView
在再次布局子视图时不会自动滚动到顶部,或者一种在打电话后集中
EditText
的方法ListView.setSelected()
或 3.有另一种方法来滚动ListView
,该不会从EditText
中清除焦点。
对于选项
- 我已经尝试了
scrollTo()
和smoothScrollToPosition()
.scrollTo
由于某种原因可以工作,但从ListView
中隐藏了某些项目(它们变得不可见,未加载)。smoothScrollToPosition()
创建一个动画,其中ListView
跳到顶部,然后将用户带回项目(并执行 2 或 3 次)。
如果您想使用EditText
从ListView
项目中获取输入,那么您应该就地使用TextView
EdiText
,然后单击TextView
您应该打开输入对话框,EditText
更简单,更好的解决方案。 在ListView
中处理EditText
焦点是多种困难的,您需要为此付出额外的Listeners
。
或
如果您的 UI/UX 中的输入框数量有限,则可以使用CustomListView
实现EditText
ScrollViews
。
当 EditText 增长时,ListView 会滚动到顶部
ListView
有一些已知的与儿童焦点相关的限制。
溶液
你为什么不尝试使用RecyclerView
而不是ListView
? 谷歌引入了RecyclerView
作为此类UI的默认推荐方式。因此,不再需要定制ListView
或黑客矿石。
您可以尝试将此属性添加到您的ListView
:
android:transcriptMode="normal"
这使得列表在收到数据集更改通知时自动滚动到底部,并且仅当最后一项已在屏幕上可见时。
在此处阅读更多内容: attr_android:转录模式 |安卓开发者