Я пытаюсь реализовать 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>