1

我有一个异步ListView加载图像的方法。ImageView为了实现这一点,我正在使用Android-Universal-Image-Loader

但我想仅当它们在列表视图中可见时才开始加载这些图像。例如,如果列表视图的可见项是从 5 到 9,则只应加载那些。此外,如果用户滚动非常快,则ListView只有在停止时才应加载这些项目。最好的方法是什么?

4

2 回答 2

4

如果您在列表视图适配器中使用“视图重用”,那么您不应该做任何事情。UIL 为您完成。UIL 不会加载所有滚动的图像,只会加载任务池中的那些(您可以在配置中设置设置池大小)。如果您使用“视图重用”,则不会加载快速滚动的图像。查看 GitHub 上的示例项目。

UPD:自 1.7.0 版本以来,UIL 具有PauseOnScrollListener.

boolean pauseOnScroll = true;
boolean pauseOnFling = true;
listView.setOnScrollListener(new PauseOnScrollListener(pauseOnScroll, pauseOnFling));
于 2012-11-03T08:50:16.393 回答
1

使用OnScrollListener,当 ListView 在、(较慢的滚动)和(较快的滚动)onScrollStateChanged()之间切换时调用该方法。有了这个,您可以选择仅在状态为“空闲”或“触摸”时加载新图像。SCROLL_STATE_IDLESCROLL_STATE_TOUCH_SCROLLSCROLL_STATE_FLING


添加

在第一次运行中,未显示 ListView 的可见项。例如,当应用程序启动时,如果 ListView 有 4 个可见项目,则应加载这 4 个图像。

我自己没有使用通用图像加载器,但是根据您在下面的描述,您需要知道在开始下载之前将显示多少行。试试这个:

  • 编写一个 Runnable 来启动异步下载。
  • 绘制行,使用 ListView 的内置处理程序调用 Runnable

例如:

private Runnable loadImages = new Runnable() {
    @Override
    public void run() {
        // Start the asynchronous downloads
    }
};

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    mListView.post(loadImages);
}

将在绘制 ListViewloadImages调用,因此您将确切知道有多少行可见。

于 2012-11-02T23:10:25.393 回答