2

我创建了一个简单的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"通过ArrayAdapterI 填充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)。我选择了该特定设备来重现用户遇到的错误。

4

1 回答 1

0

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

  • 每当用户更改滚动状态时,使用AbsListView.OnScrollListeneronScroll回调跟踪滚动状态。保存 的值firstVisibleItem
  • 这可能有点麻烦,但是 subclassEditText和 override onSizeChanged。在此方法中,通知您的列表视图(并且不要忘记调用super.onSizeChanged)。
  • 当您的列表视图被通知 anEditText已更改时,您应该使用您保存smoothScrollToPosition的最后一个值调用。firstVisibleItem
于 2013-07-05T00:58:58.797 回答