【问题标题】:Need some help understanding gridview/listview adapters需要一些帮助来理解 gridview/listview 适配器
【发布时间】:2016-07-10 14:11:36
【问题描述】:

@daniel Nugget 回答: 通常对于这种类型的东西,您会使用 Picasso 或 Glide.... 例如,请参见此处:https://futurestud.io/blog/picasso-adapter-use-for-listview-gridview-etc

这是困扰了一段时间的事情。在简单的情况下,您将使用适配器将数据数组转换为列表/网格。但是,就我而言,我正在下载要从我的数据库中显示的图像。因此,当我在寻找为什么某些项目重复的答案时,我来到了这篇文章:

Items inside GridView getting repeated when screen scrolls

使用以下代码:

public View getView(int position, View convertView, ViewGroup parent) {
    View v;
    if (convertView == null) {  // if it's not recycled, initialize some attributes
        LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(     Context.LAYOUT_INFLATER_SERVICE );
        v = inflater.inflate(R.layout.gridview_item_layout, parent, false);
    } else {
        v = (View) convertView;
    }
    TextView text = (TextView)v.findViewById(R.id.grid_item_text);
    text.setText(mTextIds[position]);
    ImageView image = (ImageView)v.findViewById(R.id.grid_item_image);
    image.setImageDrawable(mThumbIds[position]);
    return v;
}

现在如果我的理解是正确的,这段代码的工作方式如下:

1) 如果当前正在检查的视图没有值,我们必须将它实例化为一个新视图。因此,我们使用充气器为其分配布局,并将其添加到 viewGroup 父级(网格/列表视图)。

2) 如果当前正在检查的视图有一个值,我们只需将其返回为上一次创建时的状态。

3) 在这两种情况下(新视图或现有视图),我们都将重新分配所有值。

我不明白的是,为什么每次都必须重新分配所有值,因为当我不滚动浏览我的 Grid/ListView 时,这种情况甚至会继续发生。我遇到的问题是,即使我不滚动,我的 DownloadImageTask(自定义类)似乎又被一遍又一遍地调用,这将消耗用户的互联网数据。对于数据有限的人来说,这不是一件好事。

总结一下我的三个主要问题:

1) 为什么我们必须每次都重新分配值,即使之前已经创建了视图以防止重复项?

2) 为什么我的日志显示我的适配器(并因此重新下载我的图像)正在做某事,即使我不滚动?

3) 我是否可以调整代码,使我的图像只下载一次,并且只针对那些已显示的项目(因此我们不必一次下载(从长远来看)500 张图像,并且仍然“保存”图像所属的位置?

【问题讨论】:

  • 通常这种类型的东西你会使用 Picasso 或 Glide.... 参见这里例如:futurestud.io/blog/…
  • 谢谢,我去看看!
  • @DanielNugent 你是救生员。我花了一点时间才让它按照我想要的方式工作,但它现在就像一个魅力。我怎样才能将您的评论作为接受的答案?

标签: android image listview gridview download


【解决方案1】:

1) 因为您正在重用 View。您为对象分配新值,因此 Android 节省了机器资源,而不是将对象卸载和加载到内存中。这将不会发生,除非您滚动,否则 - 您做错了什么。

2) 因为你做错了什么,我想你每次 一个 新图像完成加载时都会更新 whole 适配器,如果你要发布更多代码 -会更容易说。

3) 当然有很多技巧,我建议你开始学习Cachedealing with large bitmaps

【讨论】:

  • 感谢您的回复!这是有道理的,但是我不知道那时我应该做错什么。我已将我的代码添加到原始帖子中。介意检查一下吗?我还想出了一个想法,首先将下载的图像添加到位图数组中,然后将位图分配给对象。这应该给我更多的控制,因为我可以检查数组中的所述位置是否还没有被占用。我还没有尝试过,但我一定会检查你的链接!至于位图本身,我确保这些是不大于 150x150 像素的缩略图。
猜你喜欢
  • 2012-02-17
  • 2012-02-10
  • 2012-02-02
  • 2016-02-10
  • 1970-01-01
  • 2022-09-24
  • 2011-03-25
  • 2020-08-06
  • 2012-01-05
相关资源
最近更新 更多