显示软键盘后获取列表视图项目位置

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