Android 中管理视图重用的代码在哪里?

Posted

技术标签:

【中文标题】Android 中管理视图重用的代码在哪里?【英文标题】:Where is the code that manages View re-use in Android? 【发布时间】:2011-01-30 15:40:26 【问题描述】:

android 中管理 View 重用的源代码在哪里?我可以想到这个过程的三个不同部分,但可能还有更多:

    确定View 是否有资格重复使用的逻辑 管理可重复使用的Views 池的代码 从池中删除可重复使用的View 并重置其属性值以表示逻辑上不同的View 的代码

编辑:博文Developing applications for Android – gotchas and quirks 给出了以下示例:

public class PencilWise extends ListActivity 
    View activeElement;
    // ...
    @Override
    public void onCreate ( Bundle savedInstanceState ) 
        // ...
        this.getListView( ).setOnItemClickListener ( new OnItemClickListener ( ) 
            public void onItemClick ( AdapterView<?> parent, View view, int position, long id ) 
                MyActivity.this.activeElement = view;
                MyActivity.this.showDialog ( DIALOG_ANSWER );
            
         );
    

showDialog 方法会显示答案对话框,需要知道用户打开了什么问题。问题是,当对话框打开时,传递给onItemClick 的视图可能已被重用,因此activeElement 将不再指向用户首先单击以打开对话框的元素!

【问题讨论】:

对于需要视图重用的地方,Android 通常有一些基础设施来帮助解决这个问题。一个例子是使用 AdapterViews/Adapter,例如 ListView 和 BaseAdapter。除此之外,我不确定这里真正要问的是什么。 @Jeremy:见https://jonhoo.wordpress.com/2010/07/17/developing-applications-for-android-gotchas-and-quirks/。我不清楚,但我不是在谈论,例如,Adapter 实现通过检查getViewconvertView 参数是否非null 来重用列表项视图的能力。我说的是以某种方式内置的视图重用。 @Jeremy:我想这段代码在platform/frameworks/base 的某个地方,但我不知道在哪里。 【参考方案1】:

视图回收由AbsListView 及其子类ListViewGridView 执行。你可以在这里找到这些类的源代码:https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/widget

ListViewAbsListView 开头。

【讨论】:

【参考方案2】:

我认为您正在寻找的一个很好的例子是位于 widget 包中的 AbsListView.RecycleBin 内部类。 您可以在此处在线查看代码: https://android.googlesource.com/platform/frameworks/base/+/android-2.2_r1.1/core/java/android/widget/AbsListView.java#3888

这是文档的摘录:

RecycleBin 有助于跨布局重用视图。回收站有两个级别 存储:ActiveViews 和 ScrapViews。 ActiveViews 是那些在屏幕上显示的视图 布局的开始。通过构建,他们正在显示当前信息。在......的最后 布局,ActiveViews 中的所有视图都降级为 ScrapViews。 ScrapViews 是旧的视图 适配器可能会使用它来避免不必要地分配视图。

【讨论】:

以上是关于Android 中管理视图重用的代码在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

防止表视图被重用(MVVM)

android片段中的视图重用

可重用的视图?

Android:定义一次视图及其子项,并在任何地方重用它

在 android studio java 代码中在哪里声明视图?声明应该在 onCreate 函数外部还是内部完成

Android:在哪里以及如何自动刷新列表视图(我有刷新功能)