Родитель ViewStub обнуляется - PullRequest
0 голосов
/ 11 мая 2019

У меня есть ViewHolder, который содержит ViewStub, когда я хочу привязать данные к своему представлению, я сначала проверяю, что viewStub раздуто раньше или нет?

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

тогда, если mViewStub все еще не надут, я пытаюсь надуть это:

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

но здесь я получаю исключение:

java.lang.IllegalStateException: ViewStub должен иметь ненулевое представление ViewGroupParent

Я проверил этот ответ и обнаружил, что это исключение будет выдано, когда родительский элемент ViewStub равен нулю. Отладкой я обнаружил, что это правда, и родитель моего 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 объект не создается во время выполнения, и я просто нахожу это по Id в классе ViewHolder.

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

Наконец, после этого объяснения мой главный вопрос: «почему родительский элемент mViewStub обнуляется?»

1 Ответ

0 голосов
/ 11 мая 2019

Я вижу исходный код ViewStub из здесь , и я обнаружил, что это исключение выдается только тогда, когда родительский объект равен нулю или родительский объект не является экземпляром ViewGroup.

Итак, я снова просмотрел свой код и обнаружил, что когда я раздуваю XML и передаю представление в viewHolder, представление по-прежнему не добавляется в root, поэтому родительский объект равен нулю.

Я был вынужден заменить ViewStub на пользовательский макет, который я сам реализую.

...