显示软键盘后获取列表视图项目位置
Get listview item position after soft keyboard shown
我有一个 ListView,它位于操作栏下方和 EditText 上方。
见图片:
列表视图项根据其内容具有随机高度。
点击listview item时,我需要关注EditText并打开软键盘,同时我希望被点击的那个在listview的顶部,比如我点击item2,我想看到:
为了将被点击的item放在listview的顶部,当点击一个item时,我会根据它的位置获取被点击的item View,并调用view.getLocationOnScreen(locations)
获取它的y位置,并使用这个y减去actionbar 的高度,然后我得到滚动的距离,最后调用 listview.smoothScrollBy(distance, 100);
.
这种方法在显示软键盘后效果很好,因为此时列表视图的高度将固定;但第一次点击列表视图项时效果不佳,因为此时,列表视图的高度会随着软键盘占用一些空间而改变,这导致当我使用view.getLocationOnScreen(locations)
时,它returns视图的旧位置,old表示软键盘显示前的位置,我也试过用view.postDelayed(new Runnable() {//Gets view position here!}, 1000);
,结果一样旧位置。
所以问题应该是如何在显示键盘后获取最新位置?
我对 ListView 使用 android:transcriptMode="normal"
,对 windowSoftInputMode
使用 adjustResize
。
编辑:
也尝试了 int firstVisiblePos = commentsListView.getFirstVisiblePosition();
int offset = firstVisiblePos - clickedPosition;
commentsListView.smoothScrollByOffset(offset);
,但仍然没有帮助。
您不必使用屏幕高度来滚动 listView。您可以使用 ListView smoothScrollToPosition(int position) 滚动到列表中的特定位置。
commentsListView.setSelection(clickedPosition + 1);
,知道了,虽然它没有动画(不流畅),但这对我来说很管用,但对我来说已经足够了,要使滚动到位置变得流畅,请使用此答案[link]smoothScrollToPositionFromTop() is not always working like it should
我有一个 ListView,它位于操作栏下方和 EditText 上方。
见图片:
列表视图项根据其内容具有随机高度。
点击listview item时,我需要关注EditText并打开软键盘,同时我希望被点击的那个在listview的顶部,比如我点击item2,我想看到:
为了将被点击的item放在listview的顶部,当点击一个item时,我会根据它的位置获取被点击的item View,并调用view.getLocationOnScreen(locations)
获取它的y位置,并使用这个y减去actionbar 的高度,然后我得到滚动的距离,最后调用 listview.smoothScrollBy(distance, 100);
.
这种方法在显示软键盘后效果很好,因为此时列表视图的高度将固定;但第一次点击列表视图项时效果不佳,因为此时,列表视图的高度会随着软键盘占用一些空间而改变,这导致当我使用view.getLocationOnScreen(locations)
时,它returns视图的旧位置,old表示软键盘显示前的位置,我也试过用view.postDelayed(new Runnable() {//Gets view position here!}, 1000);
,结果一样旧位置。
所以问题应该是如何在显示键盘后获取最新位置?
我对 ListView 使用 android:transcriptMode="normal"
,对 windowSoftInputMode
使用 adjustResize
。
编辑:
也尝试了 int firstVisiblePos = commentsListView.getFirstVisiblePosition();
int offset = firstVisiblePos - clickedPosition;
commentsListView.smoothScrollByOffset(offset);
,但仍然没有帮助。
您不必使用屏幕高度来滚动 listView。您可以使用 ListView smoothScrollToPosition(int position) 滚动到列表中的特定位置。
commentsListView.setSelection(clickedPosition + 1);
,知道了,虽然它没有动画(不流畅),但这对我来说很管用,但对我来说已经足够了,要使滚动到位置变得流畅,请使用此答案[link]smoothScrollToPositionFromTop() is not always working like it should