ListView图像仅在可见时显示

时间:2012-11-02 22:59:48

标签: android asynchronous android-listview universal-image-loader

我有一个ListView,可以异步地将图像加载到ImageView。要实现这一点,我使用的是Android-Universal-Image-Loader

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

2 个答案:

答案 0 :(得分:4)

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

UPD :自1.7.0版以来,UIL有 PauseOnScrollListener

boolean pauseOnScroll = true;
boolean pauseOnFling = true;
listView.setOnScrollListener(new PauseOnScrollListener(pauseOnScroll, pauseOnFling));

答案 1 :(得分:1)

使用OnScrollListener,当ListView在onScrollStateChanged()SCROLL_STATE_IDLE(较慢滚动)和SCROLL_STATE_TOUCH_SCROLL之间切换时,会调用SCROLL_STATE_FLING方法(更快滚动) )。使用此功能,您可以选择仅在状态为“空闲”或“触摸”时加载新图像。


添加

  

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

我自己没有使用过Universal Image Loader,但是从下面描述的内容中你需要知道在开始下载之前会显示多少行。试试这个:

  • 编写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);
}

绘制ListView之后,loadImages将被称为,因此您将确切知道可见的行数。