适用于运行Android 4.4.2的平板电脑。我有一个包含数百个项目的ListView,一次可见约20个。用户不希望平滑滚动的动画。如何在不使用 smoothScrollToPosition()的情况下以编程方式设置Listview中的显示位置?
我搜索了Stack Overflow并在Android ListView setSelection() does not seem to work中建议:
mListView.clearFocus();
mListView.post(new Runnable() {
@Override
public void run() {
mListView.setSelection(index);
}
});
。 。 。但它只是设定选择;它没有将ListView的那部分带入视图。 setSelection()似乎是整个网络上流行的解决方案,但我在文档中找不到任何说明 setSelection()也设置位置的东西,它只能设置选择并没有改变我的立场。
在Go to a item in Listview without using smoothScrollToPosition他们提出了Romain Guy的解决方案......
[myListView.post(new Runnable()
{
@Override
public void run()
{
myListView.setSelection(pos);
View v = myListView.getChildAt(pos);
if (v != null)
{
v.requestFocus();
}
}
});]
这个问题是我的ListView是通过自定义适配器的 getView()管理的ListActivity的一部分,因此不可见的视图被回收,即,如果我请求孩子如果视图不在屏幕上,则返回 null 。无论如何,它确实是我试图控制的ListView,所以通过子视图间接地做它似乎非常间接。
如何告诉ListView我想在屏幕上看到哪一部分?
答案 0 :(得分:5)
AbsListView中有一个名为smoothScrollToPositionFromTop()
的方法,它需要duration
个参数。因此,如果将其设置为0,则可以在不滚动动画的情况下进行。
答案 1 :(得分:0)
解决方案是到当前选择为getView
的行的getTop
。
然后从当前位置setSelectionFromTop
到getTop
突出显示而不滚动:
lv.setSelectionFromTop(position,lv.getAdapter().getView(position,view,parent).getTop());