【问题标题】:control when listView removes nonvisible views?控制 listView 何时删除不可见视图?
【发布时间】:2012-12-14 07:21:41
【问题描述】:

我发现 listView 太快地回收它的视图。

当我的 listView 滚动时,视图从屏幕上掉下来会立即被移除。

每个单元格(行)都有使用通用图像加载器加载的图像。
从屏幕上掉下来的视图在它们回到可见区域时必须重新加载图像。 (它会在短时间内显示存根图像并加载正确的图像)。

我肯定需要保持视图回收行为,但我可以修改列表视图的行为,以便用户不会注意到不断重新加载图像吗?(也许我在缓存中保留了 2-3 倍的视图数量而不是常规列表视图会)

【问题讨论】:

  • 请显示您的配置(ImageLoaderConfiguration)和显示选项(DisplayImageOptions)。

标签: android listview universal-image-loader


【解决方案1】:

不幸的是,ListView 和朋友的代码非常复杂,因为它的设计目的是在不提前知道高度的情况下滚动大小不均的项目。这使得除了默认行为之外的任何东西都很难运行。此外,您需要访问以轻松自定义行为的大多数方法都是隐藏的或私有的。尝试滚动自己的内容将是一项艰巨的工作(跨多个平台,滚动的微妙之处,投掷,拖动,滚动,键盘焦点等)。

最好的解决方案可能是维护一个图像缓存,它会在活动的视图位置周围延迟填充。不一定容易。但是尝试弄乱 ListView 更容易。

对此非常有用的 API 是 ListView.setRecyclerListener(AbsListView.RecyclerListener listener),它为您提供了一个挂钩来跟踪哪些图像被主动显示。

【讨论】:

  • 感谢您的意见。我在通用图像加载器上启用了缓存。但是从缓存中加载图像的速度不够快,所以我可以注意到它每次出去并回到屏幕时都会重新加载。也许我没有正确使用通用图像加载器的缓存?
  • @Eugene,您的列表视图上还有一个可以启用的缓存。
  • 真正的问题是你需要在可见项的前面或后面填写一两行。再多的缓存也无济于事。
【解决方案2】:

我可以建议您使用 ScrollView 而不是列表视图。 ListView 旨在有效地显示大量数据,这就是您的屏幕外项目被破坏的原因。其中涉及滚动视图,一旦加载,您将能够上下滚动而无需重新创建屏幕外对象(因为它们不会被销毁)。

见:http://developer.android.com/reference/android/widget/ScrollView.html

编辑:

如果你必须使用 listView,你可以看看这里:How do i prevent recycled ListView items from showing old content?

有可能覆盖 listView 的 getView 方法,并保留更多不被破坏的项目,而不是 listView 保留的数量。

【讨论】:

  • 感谢您的建议。但我绝对需要保持回收行为,因为我期望大量数据。我想找出一种方法来控制列表视图如何回收,或者我需要向滚动视图添加回收行为。(我不知道哪个更容易)
  • 在发布问题之前我已经看过它。看起来问题在于保留单元格的 data 而不是单元格本身。
  • 尝试查找如何覆盖 ScrollView 以刷新其上的一些数据。
猜你喜欢
  • 1970-01-01
  • 2017-07-25
  • 1970-01-01
  • 1970-01-01
  • 2011-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多