【问题标题】:Canceling 'out of view' view background tasks in a GridView取消 GridView 中的“视图外”视图后台任务
【发布时间】:2015-01-14 16:31:26
【问题描述】:

我正在寻找某种方式在 GridView(或 ListView 也可能)中的项目被删除或其内容被删除或不再可见时进行注册,以便可以立即取消后台任务。

如果我的网格看起来像这样:

* * *
* * *
* * *

每个点代表从设备加载的图像,在后台任务中。 然后在所有图像渲染完成之前快速向下滚动,它仍然会等待所有任务完成。

如何取消?似乎无法从适配器执行此操作。

如果第一行(上)在“图片”之外,那么取消这三个任务(如果有的话)并立即加载第三行(下)。

我是从 GridView 调用它还是从适配器处理它。尝试从 ImageView 中寻找一个事件,让我知道它是否没有聚焦或它的内容已被删除。没有找到任何东西。因为视图也被重用了。

例子:

* * * <- Not visible, cancel loading task (at the moment will finish loading these images)
- - -
* * *
* * *
* * * <- Now visible, prioritize these (these will come last, not first)
- - -
* * * <- Not visible yet
* * * <- Not visible yet

【问题讨论】:

  • 通常会回收不再可见的视图。您可以在适配器(convertView)的getView 中获取现在隐藏的视图

标签: android image gridview android-asynctask android-adapter


【解决方案1】:

您不应该在滚动时加载图像,因此您可以将滚动监听器添加到您的 GridView/ListView 并且当用户滚动时您应该取消加载图像。

  gridView.setOnScrollListener(new OnScrollListener() {
        @Override
        public void onScrollStateChanged(AbsListView listView, int scrollState) {
            if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_FLING) {
                //stop loading
            } else {
                //start loading
            }
        }

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        }
    });

更多信息:

http://leftshift.io/6-ways-to-make-your-lists-scroll-faster-than-the-wind

【讨论】:

  • 在滚动时,我为适配器设置了一个变量以不加载任何图像,当更改为空闲时,我将其设置为再次加载图像。但是我需要调用 notifyData 让它之后做任何事情。虽然旧图像已经加载(但位置正确),但使用此方法再次加载。这并不完全是最优的。
  • @Deukalion 使用LruCache 缓存您的图像。请参阅此链接developer.android.com/training/displaying-bitmaps/…
猜你喜欢
  • 1970-01-01
  • 2011-01-25
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 2012-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多