需要一些帮助理解gridview / listview适配器

时间:2016-07-10 14:11:36

标签: android image listview gridview downloading

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

现在这已经困扰了一段时间。在一个简单的情况下,您将使用适配器将数据数组转换为列表/网格。但是在我的情况下,我正在下载要从我的数据库显示的图像。因此,当我寻找答案为什么有些项目是重复的时候,我在这里发布了这篇文章:

Items inside GridView getting repeated when screen scrolls

使用以下代码:

prices$max1 <- lapply(1:nrow(prices), function(x) {
  holder <- maxima[maxima$dates < prices[x,1],2]
  holder <- ifelse(length(holder)>0,holder[length(holder)],NA)
  holder
})

prices$max2 <- lapply(1:nrow(prices), function(x) {
  holder <- maxima[maxima$dates < prices[x,1],2]
  holder <- ifelse(length(holder)>1,holder[length(holder)-1],NA)
  holder
})

现在,如果我的理解是正确的,那么此代码的工作原理如下:

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

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

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

我不知道的是,为什么所有的值都必须在每个单独的时间重新分配,因为当我不通过Grid / ListView滚动时,这甚至会发生。我遇到的问题是,似乎再次,即使我不滚动,我的DownloadImageTask(自定义类)被一遍又一遍地调用,这将花费用户的互联网数据。对于数据有限的人来说,这不是一件好事。

总结我的3个主要问题:

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

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

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

1 个答案:

答案 0 :(得分:1)

1)因为您重用 View。您为对象分配新值,因此Android会保存计算机资源,而不是卸载并将对象加载到内存。这将发生,除非你滚动,如果它滚动 - 你做错了。

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

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