【问题标题】:ListView Scrolls to Top when EditText Grows当 EditText 增长时 ListView 滚动到顶部
【发布时间】: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);
  }
 }
}

所以我需要的是:

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

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

对于选项

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

【问题讨论】:

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

标签: java android listview android-edittext


【解决方案1】:

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

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

【讨论】:

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

EditText 增长时ListView 滚动到顶部

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

解决方案

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

【讨论】:

【解决方案3】:

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

android:transcriptMode="normal"

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

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

【讨论】:

    猜你喜欢
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多