在多行EditText中键入时,ListView会滚动到顶部

时间:2013-07-04 23:12:35

标签: android android-listview

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

1 个答案:

答案 0 :(得分:0)

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

  • 使用AbsListView.OnScrollListener的{​​{3}}回调,在用户更改滚动状态时跟踪滚动状态。保存firstVisibleItem
  • 的值
  • 这可能有点麻烦,但是子类EditText并覆盖onSizeChanged。在此方法中,通知您的列表视图(并且不要忘记致电super.onSizeChanged)。
  • 当您的列表视图收到EditText更改后的通知时,您应该使用已保存的最后一个firstVisibleItem来致电onScroll