您可以通过 setSelectionFromTop()
和在自定义列表视图中覆盖 onSizeChanged()
来实现此目的。在您的布局中,您应该有一个 RelativeLayout
作为父容器,并将列表视图放置在编辑文本框上方。
通过创建自己的列表视图并覆盖 onSizeChange()
,您将能够在列表视图调整大小之前获取最后可见项的位置并获取其新高度,以便最终使用其高度的偏移量设置列表的“前一个”位置。
工作原理:您的列表将把前一个最后可见项放在其顶部,并将像素添加到其底部以滚动到其上方,就在您的编辑文本框上方。
要覆盖该方法并带有偏移量显示它,请按以下步骤操作:
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
int lastPosition = super.getLastVisiblePosition();
super.onSizeChanged(w, h, oldw, oldh);
super.setSelectionFromTop(lastPosition, (h - lastItemHeight));
}
lastItemHeight
是一个小技巧,因为我没有找到在 onSizeChanged 被调用之前如何获取最后一个项目的高度。然后,在您的列表视图包含许多类型的项目(高度不同)的情况下,我更喜欢在事件发生时,在软键盘打开之前获取所选高度。
因此,在自定义列表视图中,您有这个全局变量:
int lastItemHeight = 0;
在活动(或片段,无论哪个)中,您可以在OnClickListener
中更新此值:
edittext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listview.post(new Runnable() {
@Override
public void run() {
int lastPosition = listview.getLastVisiblePosition() - 1;
if ( listview.getChildAt(lastPosition) != null ) {
listview.lastItemHeight = listview.getChildAt(lastPosition).getHeight();
}
}
});
}
});
注意:
还有另一种可能的解决方案,但是您必须在ListView上设置
android:stackFromBottom="true"
,它会将内容从底部堆叠起来。与此不同的是,这里的解决方案可以显示特定的项目,而不强制内容从底部开始,遵循默认的ListView行为。
第二个注意事项:(以防万一)不要忘记在清单文件中添加
android:windowSoftInputMode="adjustResize"
。