【问题标题】:ListView scrolls to top when typing in multi-line EditText键入多行 EditText 时 ListView 滚动到顶部
【发布时间】:2013-07-04 23:12:34
【问题描述】:

我创建了一个简单的ListView,其中每一行都是一个EditText。这是我的R.layout.item

<?xml version="1.0" encoding="utf-8"?>

<EditText xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:inputType="textMultiLine">

</EditText>

注意EditText 如何通过android:inputType="textMultiLine" 标志允许多行输入。通过ArrayAdapter,我用许多行填充ListView,以便ListView 可以滚动。在我的情况下,项目是 40。这是我的MainActivity.java

public class MainActivity extends ListActivity {

    final int NUM_ITEMS = 40;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        String[] items = new String[NUM_ITEMS];
        for (int i = 0; i < NUM_ITEMS; i++) {
            items[i] = Integer.toString(i);
        }
        setListAdapter(new ArrayAdapter<String>(this, R.layout.item, items));
    }

}

我向下滚动到第 20 行并开始输入文本,但是当我到达行尾并且 EditText 更改其大小以适应第二行时,ListView 突然自动滚动到最佳。

我认为所描述的行为是一种糟糕的用户体验,我很难理解为什么它应该是默认行为。我寻找的行为是让上面的行保持不变,让下面的行移动必要的数量,以便为扩展的EditText 留出空间。我怎样才能实现它?

一些附加信息,我在针对 Android 4.2.2 的模拟器上运行此代码,该设备是 3.2 英寸 HVGA 滑块 (ADP1)。我选择了该特定设备来重现用户遇到的错误。

【问题讨论】:

  • 我建议不要混合 EditTexts 和 ListViews,因为焦点和回收,这都是一个巨大的痛苦。如果您不打算拥有那么多 EditText,我建议您只使用 ScrollView。
  • 不幸的是,我在 ListView 中围绕 EditTexts 构建了整个应用程序概念。你可以查看my app 了解为什么我不能真正改变它:) 但你是对的,这是一个巨大的痛苦。

标签: android android-listview


【解决方案1】:

确实是一个奇怪的默认行为。但是,您可以通过几个简单的步骤来解决问题,而不是为问题的原因而苦苦挣扎:

  • 使用AbsListView.OnScrollListeneronScroll 回调来跟踪用户更改滚动状态时的状态。保存firstVisibleItem 的值。
  • 这可能有点麻烦,但子类EditText 并覆盖onSizeChanged。在这个方法中,通知你的列表视图(别忘了打电话给super.onSizeChanged)。
  • 当通知您的列表视图 EditText 已更改时,您应该调用 smoothScrollToPosition 并使用您保存的最后一个值 firstVisibleItem

【讨论】:

  • 感谢您的建议!最终我发现问题只发生在硬件键盘上。如果您尝试使用软键盘运行它,而不是在大小更改时列表不会移动。我暂时放弃了尝试解决,但你的回答指向了正确的方向。
猜你喜欢
  • 2017-09-14
  • 1970-01-01
  • 2011-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多