Два адаптера DataBinding с моделью одного типа данных - PullRequest
0 голосов
/ 03 октября 2018

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

Мой главный вопрос: является ли он стандартным в шаблоне привязки данных или даже хорошей практикой или нет? И почему?

ОШИБКА: ошибка: не удается найти символ импорта packageName.ItemCheckStepsBindingImpl;

Макет элемента моего адаптера:

    <?xml version="1.0" encoding="utf-8"?>
    <layout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">

        <data>
            <variable
                name="checkSteps"
                type="packageName.data.model.Steps"/>//in this Line i'm using again in another Item layout
        </data>

        <com.google.android.material.card.MaterialCardView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:cardBackgroundColor="@color/white"
            app:cardElevation="8dp"
            style="@style/MyCard"
            >

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="horizontal"
                android:weightSum="2">



                <androidx.appcompat.widget.AppCompatImageView
                    android:id="@+id/user_confirm"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="left|center_vertical"
                    android:layout_margin="@dimen/inner_margin"
                    android:layout_weight=".1"
                    app:srcCompat="@drawable/ic_check_green_24dp"
                    android:visibility="invisible"
                    />

                <LinearLayout
                    android:id="@+id/container"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:padding="@dimen/inner_margin"
                    android:orientation="vertical"
                    android:layout_gravity="right"
                    android:layout_weight="1.8"
                    >


                    <androidx.appcompat.widget.AppCompatTextView
                        android:id="@+id/title"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:gravity="right"
                        android:text='@{steps.title}'
                        style="@style/HeadTextView"
                        android:layout_margin="@dimen/inner_margin"
                        />


                    <androidx.appcompat.widget.AppCompatTextView
                        android:id="@+id/description"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:gravity="right"
                        android:text='@{steps.description}'
                        style="@style/BodyTextView"
                        android:layout_margin="@dimen/inner_margin"
                        />


                </LinearLayout>

            </LinearLayout>

        </com.google.android.material.card.MaterialCardView>

</layout>

Мой второй элемент адаптера:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data>
        <variable
            name="steps"
            type="com.isatelco.diettrainer.data.model.Steps"/>
    </data>

    <com.google.android.material.card.MaterialCardView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:cardBackgroundColor="@color/white"
        app:cardElevation="8dp"
        style="@style/MyCard"
        >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="horizontal"
            android:weightSum="2">


            <androidx.appcompat.widget.AppCompatImageView
                android:id="@+id/deleteStep"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight=".1"
                android:layout_gravity="center_vertical"
                app:srcCompat="@drawable/ic_clear_red_24dp"
                />

            <LinearLayout
                android:id="@+id/container"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="@dimen/inner_margin"
                android:orientation="vertical"
                android:layout_gravity="right"
                android:layout_weight="1.8"
                >


                <androidx.appcompat.widget.AppCompatTextView
                    android:id="@+id/title"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:gravity="right"
                    android:text='@{steps.title}'
                    style="@style/HeadTextView"
                    android:layout_margin="@dimen/inner_margin"
                    />


                <androidx.appcompat.widget.AppCompatTextView
                    android:id="@+id/description"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:gravity="right"
                    android:text='@{steps.description}'
                    style="@style/BodyTextView"
                    android:layout_margin="@dimen/inner_margin"
                    />


            </LinearLayout>

        </LinearLayout>

    </com.google.android.material.card.MaterialCardView>


</layout>

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

хорошо. Я выяснил, в чем проблема. Вы не можете иметь два элемента с двумя разными именами в типе переменной данных с одной моделью данных:

<data>
    <variable
        name="name"
        type="com.example.Item"/>
</data>

я думаю, что это неизвестный аспект привязки данныхчто нельзя указывать два разных имени в двух элементах переменной «имя» с одной моделью «тип», поэтому решение состоит в том, чтобы присвоить одно конкретное имя двум элементам.

0 голосов
/ 03 октября 2018
<data>

    <variable
        name="name"
        type="com.example.Item"/>
</data>

/ в этой строке я снова использую в другом макете элемента

Это не что иное, как обычная переменная, такая же, как в классе Java.Вы можете объявить переменную столько раз, сколько захотите.

ошибка: невозможно найти символ импорта packageName.ItemCheckStepsBindingImpl;

Правильный импорт должен быть

<data>
    <variable
        name="checkSteps"
        type="com.yourpackage.data.model.Steps"/>//in this Line i'm using again in another Item layout
</data>

Если есть вероятность ошибки, просто введите «Шаги» в тексте, затем примите предложение.

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

Обновление

Убедитесь, что вы импортируете yourpackage.databinding.ItemCheckStepsBinding NOT packageName.ItemCheckStepsBindingImpl в свой адаптер.

Обновление

Вы не можете иметь два элемента с двумя разными именами в типе переменной данных:

Вы не правы здесь.Вы можете определить любое количество переменных со многими именами.

layout_one.xml

<variable
    name="itemOne"
    type="com.example.Item"/>

В классе Java

  binding.setItemOne();

layout_two.xml

<variable
    name="itemTwo"
    type="com.example.Item"/>

В классе Java

  binding.setItemTwo();

layout_three.xml

<variable
    name="itemOne"
    type="com.example.Item"/>

<variable
    name="itemTwo"
    type="com.example.Item"/>

В классе Java

  binding.setItemOne();      
  binding.setItemTwo();

Все вышеперечисленные случаи будут работать.

...