首页 > 解决方案 > ViewStub 父级变为空

问题描述

我有一个包含 a 的 ViewHolder ViewStub,当我想将数据绑定到我的视图中时,我首先检查viewStub之前是否膨胀?

if (mViewStub != null) //still not inflated

然后,如果mViewStub仍然没有充气,我尝试通过以下方式充气:

LinearLayout root = ((LinearLayout) mViewStub.inflate());

但在这里我得到例外:

java.lang.IllegalStateException:ViewStub 必须有一个非空的 ViewGroup viewParent

我检查了这个答案,发现当ViewStub的父级为null时会抛出这个异常。通过调试,我发现这是真的,并且我的父母mViewStub为空。

xml 文件很简单,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/root_view"
     android:layout_width="60dp"
     android:layout_height="100dp"
>

    <ViewStub
        android:id="@+id/view_cell_stub"
        android:layout="@layout/item_card"
        android:layout_width="60dp"
        android:layout_height="100dp"/>

</FrameLayout>

我必须提到ViewStub对象不是在运行时创建的,我只是在 ViewHolder 类中通过 Id 找到它。

ViewStub mViewStub = itemView.findViewById(R.id.view_cell_stub);

最后,经过这个解释,我的主要问题是“为什么父级mViewStub变为空”?

标签: androidandroid-inflateviewstub

解决方案


ViewStub我从这里看到了源代码,我发现只有当父级为空或父级不是 ViewGroup 的实例时才会引发此异常。

所以我再次查看了我的代码,我发现当我膨胀 XML 并将视图传递给 viewHolder 时,仍然没有将视图添加到 root 中,因此父级为空。

我被迫用我自己实现的自定义布局替换 ViewStub。


推荐阅读