我创建了一个简单的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)。我选择了该特定设备来重现用户遇到的错误。
答案 0 :(得分:0)
确实是一种奇怪的默认行为。但是,您可以通过几个简单的步骤来解决问题,而不是解决问题的原因:
AbsListView.OnScrollListener
的{{3}}回调,在用户更改滚动状态时跟踪滚动状态。保存firstVisibleItem
。EditText
并覆盖onSizeChanged
。在此方法中,通知您的列表视图(并且不要忘记致电super.onSizeChanged
)。EditText
更改后的通知时,您应该使用已保存的最后一个firstVisibleItem
来致电onScroll
。