Адаптер привязки данных в android для NumberPicker - PullRequest
0 голосов
/ 13 марта 2020

Я пытаюсь реализовать NumberPicker с привязкой данных. Честно говоря, я понятия не имею, как это сделать, я произвел большое количество ошибок. Я нашел кусок кода для различных адаптеров на Github. Я пытался подключить этот код к моей ViewModel https://github.com/luxiaoming/MVVMDemo/blob/master/adapters/android/databinding/adapters/NumberPickerBindingAdapter.java. Как я уже сказал, я не знаю, как заставить его работать. Кто-нибудь может дать мне несколько советов по этому вопросу, пожалуйста?

Класс ViewModel:

@BindingMethods({
        @BindingMethod(type = NumberPicker.class, attribute = "android:format", method = "setFormatter"),
        @BindingMethod(type = NumberPicker.class, attribute = "android:onScrollStateChange", method = "setOnScrollListener"),
})
@InverseBindingMethods({
        @InverseBindingMethod(type = NumberPicker.class, attribute = "android:value"),
})
public class ItemEntryViewModel extends ViewModel {
    private Context context;
    private static int quantity;
    private static int priority;
    public int itemQuantity;

    public ItemEntryViewModel(Context context) {
        this.context = context;
    }

    @BindingAdapter("android:text")
    public static void setQuantityInput(EditText editText, int itemQuantity) {
        editText.setText(String.valueOf(itemQuantity));
    }

    @InverseBindingAdapter(attribute = "android:text")
    public static int getQuantityFromBinding(EditText editText) {
        String itemQuantity = editText.getText().toString();
        try {
            quantity = Integer.parseInt(itemQuantity);
            return quantity;
        } catch (NumberFormatException e) {
            e.printStackTrace();
        }
        return quantity;
    }

    @BindingAdapter("android:value")
    public static void setValue(NumberPicker view, int value) {
        if (view.getValue() != value) {
            view.setValue(value);
        }
    }

    @BindingAdapter(value = {"android:onValueChange", "android:valueAttrChanged"},
            requireAll = false)
    public static void setListeners(NumberPicker numberPicker, final NumberPicker.OnValueChangeListener listener,
                                    final InverseBindingListener attrChange) {
        if (attrChange == null) {
            numberPicker.setOnValueChangedListener(listener);
        } else {
            numberPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
                @Override
                public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
                    if (listener != null) {
                        listener.onValueChange(picker, oldVal, newVal);
                    }
                    attrChange.onChange();
                }
            });
        }
    }
    @InverseBindingAdapter(attribute = "android:value")
    public static int getPriorityFromBinding(NumberPicker numberPicker) {
        try {
            priority = numberPicker.getValue();
            return priority;
        } catch (NumberFormatException e) {
            e.printStackTrace();
        }
        return priority;
    }

}

И XML макет:

<?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="clickHandler"
            type="mypackage.packname.ItemEntryActivity.ItemEntryActivityClickHandlers" />

        <variable
            name="shopItem"
            type="mypackage.packname" />

        <variable
            name="entryConverter"
            type="mypackage.packname.ItemEntryViewModel" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/grey_background"
        tools:context=".ItemEntryActivity">

        <TextView
            android:id="@+id/tv_item_label"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/margin_default"
            android:text="@string/shop_item_name"
            android:textAppearance="@style/TextAppearance.AppCompat.Display1"
            android:textSize="@dimen/text_large"
            android:textStyle="bold"
            app:layout_constraintHorizontal_bias="0.03"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/et_name"
            app:layout_constraintTop_toTopOf="parent" />

        <EditText
            android:id="@+id/et_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/margin_default"
            android:ems="10"
            android:inputType="textPersonName"
            android:text="@={shopItem.shopItemName}"
            android:textSize="@dimen/text_normal"
            app:layout_constraintBottom_toTopOf="@id/tv_description_label"
            app:layout_constraintHorizontal_bias="0.03"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/tv_item_label" />

        <TextView
            android:id="@+id/tv_description_label"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/margin_default"
            android:text="@string/tv_shop_item_description_label"
            android:textAppearance="@style/TextAppearance.AppCompat.Display1"
            android:textSize="@dimen/text_large"
            android:textStyle="bold"
            app:layout_constraintBottom_toTopOf="@id/et_description"
            app:layout_constraintHorizontal_bias="0.03"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/et_name" />

        <EditText
            android:id="@+id/et_description"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/margin_default"
            android:ems="10"
            android:inputType="textPersonName"
            android:text="@={shopItem.shopItemDescription}"
            app:layout_constraintBottom_toTopOf="@id/tv_quantity_label"
            app:layout_constraintHorizontal_bias="0.03"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/tv_description_label" />

        <TextView
            android:id="@+id/tv_quantity_label"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/margin_default"
            android:text="@string/tv_shop_item_quantity_label"
            android:textAppearance="@style/TextAppearance.AppCompat.Display1"
            android:textSize="@dimen/text_large"
            android:textStyle="bold"
            app:layout_constraintBottom_toTopOf="@id/quantity_entry"
            app:layout_constraintHorizontal_bias="0.03"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/et_description" />

        <LinearLayout
            android:id="@+id/quantity_entry"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/margin_default"
            android:orientation="horizontal"
            android:weightSum="5"
            app:layout_constraintBottom_toTopOf="@id/np_priority"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/tv_quantity_label">

            <ImageButton
                android:id="@+id/btn_decrease_quantity"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical|start"
                android:layout_margin="@dimen/margin_default"
                android:layout_weight="1"
                android:backgroundTint="@color/primary"
                android:src="@drawable/ic_subtract" />

            <EditText
                android:id="@+id/et_quantity"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:text="@={entryConverter.itemQuantity}"
                android:layout_margin="@dimen/margin_default"
                android:layout_weight="3"
                android:ems="10"
                android:inputType="number" />

            <ImageButton
                android:id="@+id/btn_increase_quantity"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical|end"
                android:layout_margin="@dimen/margin_default"
                android:layout_weight="1"
                android:backgroundTint="@color/primary"
                android:src="@drawable/ic_add" />

        </LinearLayout>

        <TextView
            android:id="@+id/tv_priority"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/margin_default"
            android:text="@string/tv_shop_item_priority_label"
            android:textAppearance="@style/TextAppearance.AppCompat.Display1"
            android:textSize="@dimen/text_large"
            android:textStyle="bold"
            app:layout_constraintBottom_toTopOf="@id/np_priority"
            app:layout_constraintHorizontal_bias="0.03"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/quantity_entry" />

        <NumberPicker
            android:id="@+id/np_priority"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/margin_default"
            android:value="@{entryConverter.setValue}"
            app:layout_constraintBottom_toTopOf="@id/btn_save_item"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/quantity_entry" />

        <Button
            android:id="@+id/btn_save_item"
            style="@style/Widget.AppCompat.Button.Colored"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/margin_default"
            android:background="@color/primary"
            android:onClick="@{clickHandler::onSubmitButtonClicked}"
            android:text="@string/save_item_button"
            android:textColor="@color/accent"
            android:textSize="@dimen/text_xlarge"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintHorizontal_bias="0.03"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/et_description"
            app:layout_constraintVertical_bias="0.95" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>
...