Добавить динамическое представление для конкретного RecyclerView.Adapter - PullRequest
0 голосов
/ 28 июня 2019

В настоящее время я тестирую свой код для ситуаций, когда RecyclerView.Adapter требуется дополнительная информация для отображения в нем.Используя приведенный ниже код, который находится внутри onBindViewHolder, я смог выполнить эту работу.

TableRow row = new TableRow(mCtx);
row.setLayoutParams(new TableLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
row.setOrientation(LinearLayout.VERTICAL);

TextView lbl = new TextView(mCtx);
lbl.setText("Desc1");

TextView lbl2 = new TextView(mCtx);
lbl2.setText("54.77");

row.addView(lbl);
row.addView(lbl2);

holder.binding.tblTicketItemDetails.addView(row);

Этот код всегда вызывается внутри OnBindViewHolder, чтобы имитировать, что в каждом элементе есть дополнительная информация.Если я продолжаю создавать элемент, нажимая Button, дополнительная информация увеличивается для каждого элемента.

Как настроить таргетинг на макет определенного адаптера при использовании DataBinding?

Это макет, который я использую для RecyclerView.Adapter.

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

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

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TableRow
            android:id="@+id/tableRow6"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginTop="8dp"
            android:weightSum="2"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent">

            <TextView
                android:id="@+id/lblTicketItemName"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:padding="8dp"
                android:text="@{ticket_item.description}"
                android:textColor="@color/black"
                android:textSize="18sp"
                android:textStyle="bold"
                tools:text="Test Text" />

            <TextView
                android:id="@+id/lblTicketItemPrice"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:gravity="end"
                android:padding="8dp"
                android:text="@{ticket_item.price}"
                android:textColor="@color/black"
                android:textSize="18sp"
                android:textStyle="bold"
                tools:text="Test Text" />
        </TableRow>

        <TableLayout
            android:id="@+id/tblTicketItemDetails"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginBottom="8dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/tableRow6">

        </TableLayout>

    </android.support.constraint.ConstraintLayout>
</layout>

Я хочудобавить TableRow с 2 TextView с в tblTicketItemDetails при необходимости.Каков наилучший способ сделать это?Если я не могу сделать это при использовании DataBinding, я бы переключился на старый способ.

1 Ответ

1 голос
/ 28 июня 2019

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

@BindingAdapter({"addDynamicView", "position"})
public static void addDynamicView(TableLayout layout, TicketItem item, int position) {
   // LayoutInflater inflater = LayoutInflater.from(layout.getContext()); // if you need layout inflater
    for (int i = 0; i <= position; i++) { // loop to whatever condition you have
        TextView lbl = new TextView(layout.getContext());
        lbl.setText("Desc1");
        layout.addView(lbl);
    }
}

Изменить TableLayout в xml,

 <TableLayout
            android:id="@+id/tblTicketItemDetails"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginBottom="8dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/tableRow6"
            app:addDynamicView = "@{ticket_item}"
            app:position = "@{position}">

Объявить новую переменную в xml,

<variable
            name="position"
            type="int" />

Отправить позицию из Java в xml

holder.binding.setVariable(BR.position, position);

или

holder.binding.setPosition(position);
...