【发布时间】: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