我有一个ListView,它位于动作栏上方和EditText上方。 见图:
列表视图项根据其内容具有随机高度。
当点击列表视图项时,我需要关注EditText并打开软键盘,同时我希望点击的那个位于列表视图的顶部,例如,如果我点击item2,我想看到:
为了将点击的项目置于列表视图的顶部,当点击某个项目时,我将按其位置获取所点击的项目View,并调用view.getLocationOnScreen(locations)
获取其y位置,并使用此y减去操作栏的高度,然后我得到滚动的距离,最后呼叫listview.smoothScrollBy(distance, 100);
。
这种方法在显示软键盘后效果很好,因为列表视图的高度将被固定;但是当我第一次单击列表视图项时它不能很好地工作,因为此时,当软键盘占用一些空格时,列表视图的高度将会改变,这导致当我使用view.getLocationOnScreen(locations)
时,它返回视图的旧位置, old 表示显示软键盘之前的位置,我也尝试使用view.postDelayed(new Runnable() {//Gets view position here!}, 1000);
,但是获得了相同的旧位置。< / p>
所以问题应该是如何在显示键盘后获得最新位置?
我将android:transcriptMode="normal"
用于ListView,将adjustResize
用于windowSoftInputMode
。
编辑:
还尝试了int firstVisiblePos = commentsListView.getFirstVisiblePosition();
int offset = firstVisiblePos - clickedPosition;
commentsListView.smoothScrollByOffset(offset);
,但仍然没有帮助。
答案 0 :(得分:0)
您不必使用屏幕高度滚动listView。您可以使用ListView的smoothScrollToPosition(int position)滚动到列表中的特定位置。
答案 1 :(得分:0)
commentsListView.setSelection(clickedPosition + 1);
,得到它,只是这对我有用,虽然它没有动画(不流畅),对我来说已经足够好了,为了使平滑滚动到位,使用这个答案[link] { {3}}