【问题标题】:best practice for updating an adapter更新适配器的最佳实践
【发布时间】:2013-07-21 05:21:15
【问题描述】:

我有一个适配器,它显示带有文本的缩略图网格。这些缩略图加载繁重,绘制繁重等。

缩略图网格视图不断填充新内容,例如每 2 秒 1 个新项目。

我的适配器有一个我从外部调用以注入新项目的函数:

public void postNew(Item i) {
    arrayStuff.put(i);
    notifyDataSetChanged();
}

使用我当前的方法会发生什么,当我在 gridview 中插入一个新元素时,它会刷新所有内容,即使添加的项目不可见。刷新过程有点破坏体验,特别是当用户正在浏览 gridview 并且有新内容到达时。

您建议如何改进这一点?是否有更轻的“notifyDataSetChanged()”或类似的东西?

【问题讨论】:

    标签: android gridview adapter


    【解决方案1】:

    不知道有什么轻量版本的notify数据集,但是你可以随时使用ListView.getFirstVisiblePosition和ListView.getLastVisiblePosition来判断你最近添加的位置是否可见,如果是就调用notifyDataSetChanged。

    至于“重”位图,我认为您应该重新采样或将其缩放到所需的最小尺寸,使用 LruCache 您可以减少通知数据集更改时重新绘制的需要。

    【讨论】:

    • 有趣...如果getLastVisiblePosition
    • 哦,我的错,您需要 notifydatasetchanged 让您的列表视图知道添加项目,您可以做的一件事是每次您的 getview 调用最后一个位置时,您将检查 arrayStuff .getSize == listSize,如果不匹配,你可以做一个 notifydatasetchanged。
    • 似乎是一个不错的技巧。我需要某种后台刷新,因为有时可能会发生列表有 3000 个项目,添加了新项目,而用户只显示前 25 个。我这里根本不需要任何重绘!我正在浏览底层小部件(TwoWayGridView)的源代码,我看到它在 DataSetChanged() 中做了很多与优化绘制内容相关的事情,我怀疑它会一遍又一遍地丢弃我的数据以进行这些优化.. .
    【解决方案2】:

    听起来您可能需要实现某种形式的缓存,将不可见的图像加载到内存中并不是很好的内存管理,理想情况下,您可以在它们变为(或即将变为)时从缓存中检索它们可见。

    另一种方法是在新内容到达时添加某种形式的视觉指示器,然后实现“下拉​​刷新”或类似功能,然后调用适配器上的 notifyDataSetChanged() 以刷新内容。我可以想象,每几秒钟刷新一次并不会提供出色的用户体验,因为如果屏幕内容不断变化,就很难跟上。

    【讨论】:

    • 感谢您的建议...事实上,我已经有缓存,但没有在内存中,我将网络中的图像缓存到 sdcard 中。我还没有在内存中使用 LRU,我试图避免它,如果我设法避免适配器重新绘制,sdcard 方案对我来说足够快,并且节省更多内存:)
    【解决方案3】:

    您需要创建自定义视图(在运行时动态),添加多个图像视图和适当的文本视图,容器视图应该是线性布局,之后您可以更新特定的视图或元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-02
      • 2010-10-01
      • 2017-01-31
      • 2015-12-02
      相关资源
      最近更新 更多