【发布时间】:2014-01-24 09:10:43
【问题描述】:
我的适配器(填充 ListView)的方法 getView 中有以下代码
public View getView(int position, View parent, ViewGroup root) {
View view = LayoutInflater.from(getActivity()).inflate(R.layout.my_layout, null);
ImageView imageView = view.findViewById(R.id.myImageView);
String address = addresses[position];
MyNetworkLibrary.loadAndSetImage(address, imageView);
return view;
}
ListView 的单元格有一个 ImageView,它们可以在其中加载远程图像。
MyNetworkLibrary.loadAndSetImage 方法下载远程图像,并在收到响应后将其设置到我的 ImageView 中。 问题在于,对于 ListView 的每一行,getView 方法通常被多次调用,虽然我使用缓存,但由于图像未进入缓存,因此我的应用程序对每一行执行多个请求。
有没有办法知道最后一次调用 getView 的时间?或者,您是否考虑过更好的解决方案?
【问题讨论】:
-
在您的布局中,您为 layout_width 设置的值是多少?
-
width = match_parent, height = wrap_content
-
getView 每次显示该行时都会调用,因此如果用户上下滚动,则该行的 getView 没有真正的“最后一次调用”。缓存“>>为什么不缓存您的图像?相反的意思是每次调用 getView 都会调用网络,这对性能不利......
-
这是正常行为,NKN 回答中的第一个链接问题应该可以帮助您理解原因。也可能有其他原因,具体取决于您的 Activity/Fragment 布局。无论如何,使用包括来自互联网的图像在内的项目的 ListView 的正确实现应该包括某种类型的缓存。如果你不想自己写,可以考虑使用优秀的毕加索库:square.github.io/picasso
-
你也可以使用截击。 com.android.volley.toolbox.ImageLoader 有一个构造函数,它接受一个 RequestQueue 和一个 LruCache。
标签: android listview imageview