以编程方式在ListView中设置位置而不滚动

时间:2015-03-31 17:35:05

标签: android listview android-listview

适用于运行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我想在屏幕上看到哪一部分?

2 个答案:

答案 0 :(得分:5)

AbsListView中有一个名为smoothScrollToPositionFromTop()的方法,它需要duration个参数。因此,如果将其设置为0,则可以在不滚动动画的情况下进行。

smoothScrollToPositionFromTop

答案 1 :(得分:0)

解决方案是到当前选择为getView的行的getTop

然后从当前位置setSelectionFromTopgetTop突出显示而不滚动:

lv.setSelectionFromTop(position,lv.getAdapter().getView(position,view,parent).getTop());

相关问题