我有一个包含ViewStub
的ViewHolder,当我想将数据绑定到视图中时,我首先检查viewStub
是否被夸大了?
if (mViewStub != null) //still not inflated
然后,如果mViewStub
仍然没有充气,我会尝试通过以下方式对此充气:
LinearLayout root = ((LinearLayout) mViewStub.inflate());
但是在这里我得到了异常:
java.lang.IllegalStateException:ViewStub必须具有非null的ViewGroup viewParent
我检查了this answer,发现当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
的父级为空”?
答案 0 :(得分:0)
我从here看到了ViewStub
的源代码,发现只有当parent为null或parent不是ViewGroup的实例时,才会抛出此异常。
所以我再次查看了我的代码,发现当我将XML膨胀并将视图传递给viewHolder时,仍然没有将视图添加到根目录,因此父级为null。
我被迫用自己实现的自定义布局替换ViewStub。