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

Programmatically set position in ListView without scrolling

这适用于平板电脑 运行 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 的一部分,所以不可见的视图被回收,即,如果我请求不在屏幕上的视图的子视图,它 returns null。无论如何,它实际上是我要控制的 ListView,因此通过子 View 间接执行它似乎非常间接。

如何告诉 ListView 我希望它的哪一部分显示在屏幕上?

AbsListView 中有一个名为smoothScrollToPositionFromTop() 的方法,它接受duration 参数。所以如果你设置为0,你可以不滚动,动画。

smoothScrollToPositionFromTop.

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

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

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