【问题标题】:ListView, check when getView is called for the last timeListView,检查最后一次调用getView的时间
【发布时间】: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


【解决方案1】:

尝试在此question 中澄清调用getView() 的次数超出预期的问题。由于这只是我的想法,我不确定,但我认为你在问题中提出的方法不是正确的 - 我的意思是,你不应该需要计算多少次@ 987654324@ 被调用,但它不是有效地处理分配。

作为替代方案,您可以使用 LazyList 引用 getView() 方法中行的每个图像来加载图像。但是还有另一种可能的解决方案(我认为它也更优雅),我在另一个question 中提出了它。希望对你有帮助。

【讨论】:

    【解决方案2】:

    尝试使用惰性列表来简化您的工作 https://github.com/thest1/LazyList

    【讨论】:

      猜你喜欢
      • 2015-09-09
      • 2012-02-27
      • 1970-01-01
      • 1970-01-01
      • 2014-02-05
      • 2016-11-14
      • 1970-01-01
      • 1970-01-01
      • 2011-10-28
      相关资源
      最近更新 更多