ViewHolder中View类型的字段itemView引用了什么?

2023-12-27

我想弄清楚这个领域是什么itemView实际上是。这是我从文档中获取的代码片段。

public abstract static class ViewHolder {
        @NonNull
        public final View itemView;
       // others removed for simplicity
}

如果我们延长ViewHolder类,因为我们还需要指定一些派生自的类型字段View为每个列表项保存我们自己的小部件,很明显itemView不会保存我们自己的小部件。

Question

什么是itemView现场参考?我很困惑它是否引用了RecyclerView或根视图list_item_layout.xml(其中包含我们自己的小部件)。你能澄清一下是哪一个吗?

Edit

对于那些想了解内部细节的人ViewHolder,请参阅以下内容。我呈现的是完整的。

public abstract static class ViewHolder {
        @NonNull
        public final View itemView;
        WeakReference<RecyclerView> mNestedRecyclerView;
        int mPosition = -1;
        int mOldPosition = -1;
        long mItemId = -1L;
        int mItemViewType = -1;
        int mPreLayoutPosition = -1;
        RecyclerView.ViewHolder mShadowedHolder = null;
        RecyclerView.ViewHolder mShadowingHolder = null;
        static final int FLAG_BOUND = 1;
        static final int FLAG_UPDATE = 2;
        static final int FLAG_INVALID = 4;
        static final int FLAG_REMOVED = 8;
        static final int FLAG_NOT_RECYCLABLE = 16;
        static final int FLAG_RETURNED_FROM_SCRAP = 32;
        static final int FLAG_IGNORE = 128;
        static final int FLAG_TMP_DETACHED = 256;
        static final int FLAG_ADAPTER_POSITION_UNKNOWN = 512;
        static final int FLAG_ADAPTER_FULLUPDATE = 1024;
        static final int FLAG_MOVED = 2048;
        static final int FLAG_APPEARED_IN_PRE_LAYOUT = 4096;
        static final int PENDING_ACCESSIBILITY_STATE_NOT_SET = -1;
        static final int FLAG_BOUNCED_FROM_HIDDEN_LIST = 8192;
        static final int FLAG_SET_A11Y_ITEM_DELEGATE = 16384;
        int mFlags;
        private static final List<Object> FULLUPDATE_PAYLOADS = Collections.emptyList();
        List<Object> mPayloads = null;
        List<Object> mUnmodifiedPayloads = null;
        private int mIsRecyclableCount = 0;
        RecyclerView.Recycler mScrapContainer = null;
        boolean mInChangeScrap = false;
        private int mWasImportantForAccessibilityBeforeHidden = 0;
        @VisibleForTesting
        int mPendingAccessibilityState = -1;
        RecyclerView mOwnerRecyclerView;

        public ViewHolder(@NonNull View itemView) {
            if (itemView == null) {
                throw new IllegalArgumentException("itemView may not be null");
            } else {
                this.itemView = itemView;
            }
        }

        void flagRemovedAndOffsetPosition(int mNewPosition, int offset, boolean applyToPreLayout) {
            this.addFlags(8);
            this.offsetPosition(offset, applyToPreLayout);
            this.mPosition = mNewPosition;
        }

        void offsetPosition(int offset, boolean applyToPreLayout) {
            if (this.mOldPosition == -1) {
                this.mOldPosition = this.mPosition;
            }

            if (this.mPreLayoutPosition == -1) {
                this.mPreLayoutPosition = this.mPosition;
            }

            if (applyToPreLayout) {
                this.mPreLayoutPosition += offset;
            }

            this.mPosition += offset;
            if (this.itemView.getLayoutParams() != null) {
                ((RecyclerView.LayoutParams)this.itemView.getLayoutParams()).mInsetsDirty = true;
            }

        }

        void clearOldPosition() {
            this.mOldPosition = -1;
            this.mPreLayoutPosition = -1;
        }

        void saveOldPosition() {
            if (this.mOldPosition == -1) {
                this.mOldPosition = this.mPosition;
            }

        }

        boolean shouldIgnore() {
            return (this.mFlags & 128) != 0;
        }

        /** @deprecated */
        @Deprecated
        public final int getPosition() {
            return this.mPreLayoutPosition == -1 ? this.mPosition : this.mPreLayoutPosition;
        }

        public final int getLayoutPosition() {
            return this.mPreLayoutPosition == -1 ? this.mPosition : this.mPreLayoutPosition;
        }

        public final int getAdapterPosition() {
            return this.mOwnerRecyclerView == null ? -1 : this.mOwnerRecyclerView.getAdapterPositionFor(this);
        }

        public final int getOldPosition() {
            return this.mOldPosition;
        }

        public final long getItemId() {
            return this.mItemId;
        }

        public final int getItemViewType() {
            return this.mItemViewType;
        }

        boolean isScrap() {
            return this.mScrapContainer != null;
        }

        void unScrap() {
            this.mScrapContainer.unscrapView(this);
        }

        boolean wasReturnedFromScrap() {
            return (this.mFlags & 32) != 0;
        }

        void clearReturnedFromScrapFlag() {
            this.mFlags &= -33;
        }

        void clearTmpDetachFlag() {
            this.mFlags &= -257;
        }

        void stopIgnoring() {
            this.mFlags &= -129;
        }

        void setScrapContainer(RecyclerView.Recycler recycler, boolean isChangeScrap) {
            this.mScrapContainer = recycler;
            this.mInChangeScrap = isChangeScrap;
        }

        boolean isInvalid() {
            return (this.mFlags & 4) != 0;
        }

        boolean needsUpdate() {
            return (this.mFlags & 2) != 0;
        }

        boolean isBound() {
            return (this.mFlags & 1) != 0;
        }

        boolean isRemoved() {
            return (this.mFlags & 8) != 0;
        }

        boolean hasAnyOfTheFlags(int flags) {
            return (this.mFlags & flags) != 0;
        }

        boolean isTmpDetached() {
            return (this.mFlags & 256) != 0;
        }

        boolean isAdapterPositionUnknown() {
            return (this.mFlags & 512) != 0 || this.isInvalid();
        }

        void setFlags(int flags, int mask) {
            this.mFlags = this.mFlags & ~mask | flags & mask;
        }

        void addFlags(int flags) {
            this.mFlags |= flags;
        }

        void addChangePayload(Object payload) {
            if (payload == null) {
                this.addFlags(1024);
            } else if ((this.mFlags & 1024) == 0) {
                this.createPayloadsIfNeeded();
                this.mPayloads.add(payload);
            }

        }

        private void createPayloadsIfNeeded() {
            if (this.mPayloads == null) {
                this.mPayloads = new ArrayList();
                this.mUnmodifiedPayloads = Collections.unmodifiableList(this.mPayloads);
            }

        }

        void clearPayload() {
            if (this.mPayloads != null) {
                this.mPayloads.clear();
            }

            this.mFlags &= -1025;
        }

        List<Object> getUnmodifiedPayloads() {
            if ((this.mFlags & 1024) == 0) {
                return this.mPayloads != null && this.mPayloads.size() != 0 ? this.mUnmodifiedPayloads : FULLUPDATE_PAYLOADS;
            } else {
                return FULLUPDATE_PAYLOADS;
            }
        }

        void resetInternal() {
            this.mFlags = 0;
            this.mPosition = -1;
            this.mOldPosition = -1;
            this.mItemId = -1L;
            this.mPreLayoutPosition = -1;
            this.mIsRecyclableCount = 0;
            this.mShadowedHolder = null;
            this.mShadowingHolder = null;
            this.clearPayload();
            this.mWasImportantForAccessibilityBeforeHidden = 0;
            this.mPendingAccessibilityState = -1;
            RecyclerView.clearNestedRecyclerViewIfNotNested(this);
        }

        void onEnteredHiddenState(RecyclerView parent) {
            if (this.mPendingAccessibilityState != -1) {
                this.mWasImportantForAccessibilityBeforeHidden = this.mPendingAccessibilityState;
            } else {
                this.mWasImportantForAccessibilityBeforeHidden = ViewCompat.getImportantForAccessibility(this.itemView);
            }

            parent.setChildImportantForAccessibilityInternal(this, 4);
        }

        void onLeftHiddenState(RecyclerView parent) {
            parent.setChildImportantForAccessibilityInternal(this, this.mWasImportantForAccessibilityBeforeHidden);
            this.mWasImportantForAccessibilityBeforeHidden = 0;
        }

        public String toString() {
            StringBuilder sb = new StringBuilder("ViewHolder{" + Integer.toHexString(this.hashCode()) + " position=" + this.mPosition + " id=" + this.mItemId + ", oldPos=" + this.mOldPosition + ", pLpos:" + this.mPreLayoutPosition);
            if (this.isScrap()) {
                sb.append(" scrap ").append(this.mInChangeScrap ? "[changeScrap]" : "[attachedScrap]");
            }

            if (this.isInvalid()) {
                sb.append(" invalid");
            }

            if (!this.isBound()) {
                sb.append(" unbound");
            }

            if (this.needsUpdate()) {
                sb.append(" update");
            }

            if (this.isRemoved()) {
                sb.append(" removed");
            }

            if (this.shouldIgnore()) {
                sb.append(" ignored");
            }

            if (this.isTmpDetached()) {
                sb.append(" tmpDetached");
            }

            if (!this.isRecyclable()) {
                sb.append(" not recyclable(" + this.mIsRecyclableCount + ")");
            }

            if (this.isAdapterPositionUnknown()) {
                sb.append(" undefined adapter position");
            }

            if (this.itemView.getParent() == null) {
                sb.append(" no parent");
            }

            sb.append("}");
            return sb.toString();
        }

        public final void setIsRecyclable(boolean recyclable) {
            this.mIsRecyclableCount = recyclable ? this.mIsRecyclableCount - 1 : this.mIsRecyclableCount + 1;
            if (this.mIsRecyclableCount < 0) {
                this.mIsRecyclableCount = 0;
                Log.e("View", "isRecyclable decremented below 0: unmatched pair of setIsRecyable() calls for " + this);
            } else if (!recyclable && this.mIsRecyclableCount == 1) {
                this.mFlags |= 16;
            } else if (recyclable && this.mIsRecyclableCount == 0) {
                this.mFlags &= -17;
            }

        }

        public final boolean isRecyclable() {
            return (this.mFlags & 16) == 0 && !ViewCompat.hasTransientState(this.itemView);
        }

        boolean shouldBeKeptAsChild() {
            return (this.mFlags & 16) != 0;
        }

        boolean doesTransientStatePreventRecycling() {
            return (this.mFlags & 16) == 0 && ViewCompat.hasTransientState(this.itemView);
        }

        boolean isUpdated() {
            return (this.mFlags & 2) != 0;
        }
    }

这完全取决于你的代码,因为它指的是itemView当你打电话时new SomeViewHolder(itemView).

例如,Android Guide - Create a List with RecyclerView 的代码中 -添加列表适配器 https://developer.android.com/guide/topics/ui/layout/recyclerview#AdapterMyViewHolder 有一个 TextView 的引用v创建后。

public MyAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent,
                                               int viewType) {
    // create a new view
    TextView v = (TextView) LayoutInflater.from(parent.getContext())
            .inflate(R.layout.my_text_view, parent, false);
    ...
    MyViewHolder vh = new MyViewHolder(v);
    return vh;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ViewHolder中View类型的字段itemView引用了什么? 的相关文章

  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • 你的CPU不支持NX

    我刚刚下载了 android studio 但是我遇到了一个问题 当我运行它时 它说你的 cpu 不支持 NX 我应该怎么办 NX 或实际上是 NX 处理器位 是处理器的一项功能 有助于保护您的 PC 免受恶意软件的攻击 当此功能未启用并且
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • 在 SQLite 中搜索时排除 HTML 标签和一些 UNICODE 字符

    更新 4 我已经成功运行了firstchar例如 但现在的问题是使用regex 即使包含头文件 它也无法识别regex操作员 有什么线索可以解决这个问题吗 更新 2 我已经编译了sqlite3我的项目中的库 我现在正在寻找任何人帮助我为我的
  • 如何默认在 ActionOpenDocument 意图中显示“内部存储”选项

    我需要用户选择一个自定义文件类型的文件 并将其从 Windows 文件资源管理器拖到 Android 设备上 但默认情况下内部存储选项不可用 当我使用以下命令启动意图时 var libraryIntent new Intent Intent
  • 字符串数组文本格式化

    我有这个字符串 String text Address 1 Street nr 45 Address 2 Street nr 67 Address 3 Street nr 56 n Phone number 000000000 稍后将被使用
  • JRE 系统库 [WebSphere v6.1 JRE](未绑定)

    将项目导入 Eclipse 后 我的构建路径中出现以下错误 JRE System Library WebSphere v6 1 JRE unbound 谁知道怎么修它 右键单击项目 特性 gt Java 构建路径 gt 图书馆 gt JRE
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • Android访问远程SQL数据库

    我可以直接从 Android 程序访问远程 SQL 数据库 在网络服务器上 吗 即简单地打开包含所有必需参数的连接 然后执行 SQL 查询 这是一个私人程序 不对公众开放 仅在指定的手机上可用 因此我不担心第三方获得数据库访问权限 如果是这
  • Android Studio - Windows 7 上的 Android SDK 问题

    我对 Google i o 2013 上发布的最新开发工具 Android Studio 有疑问 我已经成功安装了该程序并且能够正常启动 我可以导入现有项目并对其进行编辑 但是 当我尝试单击 SDK 管理器图标或 AVD 管理器图标时 或者
  • 在mockito中使用when进行模拟ContextLoader.getCurrentWebApplicationContext()调用。我该怎么做?

    我试图在使用 mockito 时模拟 ContextLoader getCurrentWebApplicationContext 调用 但它无法模拟 here is my source code Mock org springframewo
  • 如何根据 gradle 风格设置变量

    我想传递一个变量test我为每种风格设置了不同的值作为 NDK 的定义 但出于某种原因 他总是忽略了最后味道的价值 这是 build gradle apply plugin com android library def test andr
  • 增加活动的屏幕亮度

    显然 Android 操作系统中至少有三种不同的技术可以改变屏幕亮度 其中两个在纸杯蛋糕之后不再起作用 而第三个被接受的技术显然有一个错误 我想在单视图活动开始时增加屏幕亮度 然后在活动结束时将亮度恢复为用户设置 没有按钮 没有第二个视图或
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r
  • Crashlytics 出现 Android Studio 构建错误

    我正在尝试将 CrashLytics 与 Android Studio 和 gradle 一起使用 但出现一个令人困惑的错误 java lang NoSuchMethodError 我的 build gradle 是 buildscript
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两
  • 使用 xpath 和 vtd-xml 以字符串形式获取元素的子节点和文本

    这是我的 XML 的一部分

随机推荐

  • C++:处理线程本地对象销毁

    我有一个日志系统 它基本上使用线程本地缓冲区来记录 这有助于减少锁定 可以将一堆消息写入线程本地缓冲区并一次性刷新 而且由于它是线程本地的 我们可以避免为每个日志消息分配缓冲区 无论如何 问题是在进程退出期间 我们在访问线程本地缓冲区时看到
  • 如何以不同的增量减去 2 个单独文件的特定行

    https i stack imgur com oYoYz png https i stack imgur com oYoYz png https i stack imgur com AdmuM png https i stack imgu
  • 如何在 MVC 模型中表示一个月的复选框

    我无法理解如何使用 MVC 创建下表 并将其成功绑定到模型 我基本上需要跟踪该月的哪几天需要发生事件 这是我对模型的尝试 EDIT 这不是一个月 而是任意 4 周的周期 public class ScheduleViewModel publ
  • 对术语...进行抽象会导致术语...类型错误

    这是我想证明的 A Type i nat index f nat nat n nat ip n lt i partial index f nat option nat L partial index f index f n Some n V
  • 在 PostgreSQL 中声明“not-null-string”数组类型的列

    使用 PostgreSQL 9 6 我可以创建一个类型为 not null array of string 的列 CREATE TABLE example foo TEXT NOT NULL 但这允许元素为空 即我可以这样做 INSERT
  • 在哪里可以找到有关如何开发(rails 3)助手的文档[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我可能是瞎子 但我真的找不到任何关于如何在 Rails 3 中为您自己的视图编写帮助程序的好文档 我正
  • 像 Android 电视 Leanback 中的 Android 手机一样的垂直列表

    我想创建一个简单的垂直列表 一行中的单列 它只能垂直滚动 不能水平滚动 我如何使用 Leanback 在 Android 电视上实现此目的 有关 ui 要求的更多说明 请参阅下图 我尝试使用 VerticalSupportFragment
  • 搜索未排序的数组

    也可能具有重复元素的未排序数组中的最小和最大比较次数是多少 我知道在未排序的数组中查找任何内容都是 O n 问题 但是 如果数组也包含重复元素 这是真的吗 我所说的重复元素是指在给定数组中多次出现的元素 所以这里的想法是你必须从头到尾遍历数
  • 互斥体是如何实现的?

    对于特定应用程序 某些实现是否比其他实现更好 通过推出自己的产品有什么收入吗 查看描述测试和设置 http en wikipedia org wiki Test and set维基百科上的机器指令 它暗示了如何在机器级别实现原子操作 我可以
  • 使用 PHP 发送文件时在 Internet Explorer 中维护自定义文件扩展名?

    我有一个服务器端 zip 存档 我想将其作为下载传递 我正在使用自定义扩展将这些特定档案与某些客户端软件相关联 例如 CustomArchive bwz Chrome 和 FireFox 可以完美处理此自定义扩展 但 Internet Ex
  • 带Executor和不带Executor的多线程区别

    我试图找出普通多线程和使用执行器的多线程 维护线程池 之间的性能差异 以下是两者的代码示例 没有执行器代码 使用多线程 import java lang management ManagementFactory import java la
  • 使用 iText 生成波斯语 PDF

    Hi 我知道很多人之前可能都问过这个问题 我几乎读过所有这些 但它无法帮助我解决我的问题 我正在使用 iText java 库生成波斯语 PDF 我正在使用以下代码 Document document new Document PageSi
  • 如何防止浏览器预加载

    我用 JavaScript 为 Chrome 编写了一个用户脚本扩展 以防止视频和音频标签在页面加载时自动下载 这是代码 var videoTags document getElementsByTagName Video var i for
  • 如何在保存到 Parse.Cloud.beforeSave 之前将照片调整为多种照片尺寸

    首先让我先说我让这段代码完美地工作以获得缩略图 https parse com docs cloud modules guide images https parse com docs cloud modules guide images
  • Google 计算器千位分隔符特殊字符

    注意 有关此问题的更多答案 请参阅Google 计算器中的特殊字符 https stackoverflow com questions 12867450 special characters in google calculator 我注意
  • 构建与系统具有相同证书的Android APK

    我正在尝试让系统应用程序正常工作 这是我所拥有的 具有完整 4 4 2 源代码的 OEM OMAP 平台 我已经使用 Ubuntu 14 04 构建了系统并加载到我的平台上 这一切都有效 现在 有一个来自 OEM 的应用程序可以直接访问硬件
  • Chartjs-plugin-annotation 与 ng2-charts 的正确配置位置?

    我在用着ng2 charts在我的 Angular 应用程序中绘制条形图 在某些时候 我不得不向我的图表添加静态线 我决定使用chartjs plugin annotation 将这两个库连接在一起没有很好的记录 但经过一些谷歌搜索后 我最
  • cmake 中何时应使用 PUBLIC/PRIVATE/INTERFACE 的示例

    我正在阅读有关 cmake 关键字的内容PUBLIC PRIVATE INTERFACE并发现了这一段here https cmake org cmake help latest manual cmake buildsystem 7 htm
  • Jquery textarea val() 不换行

    我得到一个带有 keyup 函数的文本区域 当用户输入内容时 我希望该文本呈现在 blockquote 标记内 它可以工作 但 id 不接受换行符和空格 你能帮我吗 post body keyup function blockquote f
  • ViewHolder中View类型的字段itemView引用了什么?

    我想弄清楚这个领域是什么itemView实际上是 这是我从文档中获取的代码片段 public abstract static class ViewHolder NonNull public final View itemView other