我有一个异步ListView
加载图像的方法。ImageView
为了实现这一点,我正在使用Android-Universal-Image-Loader
但我想仅当它们在列表视图中可见时才开始加载这些图像。例如,如果列表视图的可见项是从 5 到 9,则只应加载那些。此外,如果用户滚动非常快,则ListView
只有在停止时才应加载这些项目。最好的方法是什么?
我有一个异步ListView
加载图像的方法。ImageView
为了实现这一点,我正在使用Android-Universal-Image-Loader
但我想仅当它们在列表视图中可见时才开始加载这些图像。例如,如果列表视图的可见项是从 5 到 9,则只应加载那些。此外,如果用户滚动非常快,则ListView
只有在停止时才应加载这些项目。最好的方法是什么?
如果您在列表视图适配器中使用“视图重用”,那么您不应该做任何事情。UIL 为您完成。UIL 不会加载所有滚动的图像,只会加载任务池中的那些(您可以在配置中设置设置池大小)。如果您使用“视图重用”,则不会加载快速滚动的图像。查看 GitHub 上的示例项目。
UPD:自 1.7.0 版本以来,UIL 具有PauseOnScrollListener
.
boolean pauseOnScroll = true;
boolean pauseOnFling = true;
listView.setOnScrollListener(new PauseOnScrollListener(pauseOnScroll, pauseOnFling));
使用OnScrollListener,当 ListView 在、(较慢的滚动)和(较快的滚动)onScrollStateChanged()
之间切换时调用该方法。有了这个,您可以选择仅在状态为“空闲”或“触摸”时加载新图像。SCROLL_STATE_IDLE
SCROLL_STATE_TOUCH_SCROLL
SCROLL_STATE_FLING
添加
在第一次运行中,未显示 ListView 的可见项。例如,当应用程序启动时,如果 ListView 有 4 个可见项目,则应加载这 4 个图像。
我自己没有使用通用图像加载器,但是根据您在下面的描述,您需要知道在开始下载之前将显示多少行。试试这个:
例如:
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
调用,因此您将确切知道有多少行可见。