0

我有一个可能有数百个条目的 ListView。当进行选择时,我一直在使用 smoothScrollToPosition,因此:

if (lv != null) { //Are we created yet?
    lv.post(new Runnable() {
        public void run() {
            lv.smoothScrollToPosition(k);  
        }
    });
}

但我的用户告诉我他们不喜欢滚动动画,更愿意立即去那里。所以我用我的平滑滚动替换了

lv.setSelection(k);

...现在它什么都不做。FWIW 这一切都发生在 notifyDatasetChanged之后

在寻找解决方案时,我在http://code.google.com/p/android/issues/detail?id=6741上遇到了这个讨论, 这意味着这是一个已知问题。有解决方法还是我做错了?

提前致谢。

4

1 回答 1

1

setSelection 的文档说它仅在 ListView 处于触摸模式时滚动到所选位置。一旦数据集发生变化,可能 ListView 不再处于触摸模式,或者可能只是在下一个 UI 更新周期中忘记了 setSelection。

我想您可以通过延迟调用 setSelection 来尝试解决方法。例如,您可以使用延迟 100 毫秒的 postDelayed 方法。或者,您可以扩展 ListView 并覆盖 layoutChildren 或在数据集更改时可能会调用的相关内容,以便重新计算列表视图项测量值。那时调用 setSelection 应该是安全的,您不需要依赖猜测延迟。

于 2012-07-09T20:51:23.360 回答