【问题标题】:Get cached views from ListAdapter从 ListAdapter 获取缓存视图
【发布时间】:2012-02-17 04:08:03
【问题描述】:

当列表显示并滚动时,ListAdapter.getView() 要么创建一个新的列表项视图,要么对传递给它的现有视图(作为“convertView”)进行重组以显示新内容。

我想知道,是否有办法获取由 getView() 创建的所有视图?例如。如果列表项视图需要在 Activity 销毁时释放一些资源,最好遍历所有列表项视图并告诉它们释放资源。

【问题讨论】:

    标签: android android-listview listadapter android-adapter


    【解决方案1】:

    嗯,它不是像使用ListView#getChildAt(int) 遍历ListView 一样简单——ListView 是一个AbsListView 子类——而AbsListView实现 RecycleBin 用于保存将被重用的Views。

    View 被放置在RecycleBin 之前,它使用ViewGroup#detachViewFromParent(View) 与其父级(列表视图)分离,因此使用getChildAt(int) 使其无法访问。

    您应该实现的是RecyclerListener 接口,它会在View 移动到RecycleBin 时通知您。

    【讨论】:

      【解决方案2】:

      由于ListViewViewGroup,您应该能够像这样迭代子视图:

      for (int i=0; i < myListView.getChildCount(); i++) {
          View v = myListView.getChildAt(i);
      
          //Check to see if this view has the resource, then release it
      }
      

      这个问题需要类似的东西:Android: Access child views from a ListView

      【讨论】:

      • 但这只会给我当前显示的视图,而某些视图可能会被缓存但未显示。
      • 你说得对。 Jens 实现 RecyclerListener 的答案是一个更好的答案。我不知道存在这样的东西,但它应该正是你所需要的。
      【解决方案3】:

      这是java。您不能命令应用程序或实例真正被销毁以释放资源。使用 finalize() 只能提高 java 机器执行此操作的概率。

      【讨论】:

      • 我不是在寻找一种立即销毁东西的方法,而是寻找一种在我确定不再需要时释放对资源的引用的方法(即当 Activity 的 onDestroy 为称为)。
      • 两种变体有什么区别:1. A 可以释放 B,B 可以释放 C。 2. B 可以释放 C。 ---- 你把建筑减了一层,但你不能抹去它。根据这里的许多专家的说法,Android 不支持您想要做的事情。
      【解决方案4】:

      除非您的适配器在此 Activity 之外使用(在这种情况下,您真的不知道您不再需要这些视图吗?),您对该适配器的唯一引用是在 Activity 中。这意味着如果您的 Activity 被垃圾收集,您的适配器将被垃圾收集,这意味着您的视图将被收集。除非您对此行为有可衡量的问题,否则我不会费心尝试优化它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-06
        • 1970-01-01
        • 2018-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多