【问题标题】:Programmatically set position in ListView without scrolling以编程方式在 ListView 中设置位置而不滚动
【发布时间】:2015-03-31 17:35:04
【问题描述】:

这适用于运行 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,所以通过子 View 间接执行它似乎非常间接。

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

【问题讨论】:

  • 你检查this one了吗?
  • @m0skit0 看起来他不是在尝试定位;看起来他正在尝试设置选择。我没有看到我的问题的解决方案。无论如何,传递给 getView 的 convertViews 仅适用于可见视图,因此尝试在 getView 中解决此问题似乎本末倒置。

标签: android listview android-listview


【解决方案1】:

AbsListView 中有一个方法,叫做smoothScrollToPositionFromTop(),它带有duration 参数。所以如果你把它设置为0,你可以不滚动,动画。

smoothScrollToPositionFromTop.

【讨论】:

  • 优秀。工作完美。 ListView 是从 AbsListView 派生的,所以我免费获得它。谢谢!
  • 对我不起作用。具体来说,将duration 设置为 0 仍会产生动画滚动。即使将其设置为一个小的非零值,也会导致动画过渡的持续时间大大超过我指定的值。似乎 API 可能会施加一些最小持续时间/最大滚动率,或者其他什么。针对 Google Pixel 进行测试,API 级别 25。
  • @aroth 我最近并没有真正使用它。但它曾经在我回答时起作用。
  • 是的。同意。 smoothScrollToPositionFromTop() 似乎施加了最短持续时间。如果您的列表长度为 3,000,则该持续时间将被忽略,并且可能需要很长时间(4-8 秒)才能滚动到那么远。
【解决方案2】:

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

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

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

【讨论】:

  • 欢迎来到 StackOverflow!你能为这行代码写评论吗?它如何以及为什么解决 OP 问题?请在您的代码前加上` `(4个空格符号)
  • 我获取当前选择 getTop 的行的视图,然后我从当前位置 setSelectionFromTop 和 getTop 以突出显示而不滚动
猜你喜欢
  • 2011-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-20
相关资源
最近更新 更多