当 EditText 增长时 ListView 滚动到顶部
Posted
技术标签:
【中文标题】当 EditText 增长时 ListView 滚动到顶部【英文标题】:ListView Scrolls to Top when EditText Grows 【发布时间】:2017-09-14 15:21:33 【问题描述】:我在每个单元格中都有一个Listview
和EditTexts
。每当我将文本添加到 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】:按照我的观点,如果您想通过使用EditText
从ListView
项目中获取输入,那么您应该使用TextView
代替EdiText
并通过单击TextView
您应该打开并使用@ 输入对话框987654326@ 那是更简单和更好的解决方案。处理 ListView
中的 EditText
焦点非常困难,您需要为此添加额外的 Listeners
。
或
如果您的 UI/UX 中的输入框数量有限,那么您可以使用 ScrollViews
实现 EditText
和 CustomListView
。
【讨论】:
我刚刚测试了你的方法。第二个对我来说完美无缺。我所做的是在滚动视图中使用线性布局,并以编程方式在 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 中看起来像 TextView 的 EditText
Android 中listview中嵌套edittext问题
listview中的item是自定义的含有textview和edittext 还有button 点击listview外的按钮增加一个item问题