如何在 android 的 mvvm 模型中使用复选框
how to work with checkox in mvvm model in android
我正在研究 Recyclerview,其中有复选框。我想知道如何使用下面的方法在 android.
中实现 MVVM 数据绑定
@BindingAdapter({"app:setCheckBoxListener"})
public static void setCheckBoxListener(AppCompatCheckBox checkBox, final OnCheckListener onCheckListener) {
checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
onCheckListener.onCheckChanged(isChecked, (String) buttonView.getText());
}
});
}
这是我用于逻辑部分的 ViewModel class。我希望当我选中复选框时,数据将保存在 ArrayList 中。
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;
import android.widget.Toast;
import com.codestrela.product.adapters.SelectContactAdapter;
import com.codestrela.product.data.Contact;
import com.codestrela.product.fragments.ListDialogFragment;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.ArrayList;
public class ListDialogViewModel {
private static final String TAG = "ListDialogViewModel";
public static final String CONTACT_LIST = "contact_list";
public RowSelectContactViewModel viewModel;
ListDialogFragment listDialogFragment;
ArrayList<RowSelectContactViewModel> selectViewmodel;
ArrayList<Contact> contacts;
public SelectContactAdapter adapter;
public ListDialogViewModel(ListDialogFragment listDialogFragment) {
this.listDialogFragment = listDialogFragment;
adapter = new SelectContactAdapter(new ArrayList<RowSelectContactViewModel>());
selectViewmodel = new ArrayList<>();
onContact();
}
public void onContact() {
contacts = new ArrayList<>();
SharedPreferences sharedPreferences = listDialogFragment.getActivity().getSharedPreferences("shared preference", Context.MODE_PRIVATE);
Gson gson = new Gson();
String json = sharedPreferences.getString(CONTACT_LIST, null);
Toast.makeText(listDialogFragment.getActivity(), "" + json, Toast.LENGTH_SHORT).show();
Type type = new TypeToken<ArrayList<Contact>>() {
}.getType();
contacts = gson.fromJson(json, type);
Log.e(TAG, "array size: " + contacts.toString());
for (int i = 0; i < contacts.size(); i++) {
viewModel = new RowSelectContactViewModel();
String name = contacts.get(i).getName();
viewModel.contactName.set(name);
viewModel.contactNumber.set(contacts.get(i).getNumber());
Toast.makeText(listDialogFragment.getActivity(), " check "+viewModel.contactCheckbox.get(), Toast.LENGTH_SHORT).show();
selectViewmodel.add(viewModel);
}
adapter.addAll(selectViewmodel);
}
}
这是我在应用程序的回收站视图中使用的行布局。这个复选框是我在应用程序中使用的。请帮助我,我是新手。
<?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="vm"
type="com.codestrela.product.viewmodels.RowSelectContactViewModel" />
</data>
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardCornerRadius="8dp"
android:layout_margin="8dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:checked="@{vm.contactCheckbox.get()}"
android:layout_alignParentLeft="true"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_margin="8dp"
android:layout_gravity="center">
<TextView
android:id="@+id/contact_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{vm.contactName}"
android:layout_gravity="center"
android:textSize="18dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{vm.contactNumber}"
android:textSize="14dp"
android:layout_marginTop="4dp"
android:layout_gravity="center"
/>
</LinearLayout></LinearLayout></androidx.cardview.widget.CardView>
</layout>
不用做BindingAdapter,太简单了
根据 docs of two-way data binding ,您只需将其添加到您的 xml
它提供设置复选框的初始状态和onCheckedChange
<CheckBox
android:id="@+id/rememberMeCheckBox"
android:checked="@={viewmodel.rememberMe}"
/>
你必须把它保存到布尔值变量
boolean contactCheckbox;
所以在你的 xml 中它将是
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:checked="@={vm.contactCheckbox}"
android:layout_alignParentLeft="true"/>
只需添加等号 =
.. 即可实现双向绑定
我正在研究 Recyclerview,其中有复选框。我想知道如何使用下面的方法在 android.
中实现 MVVM 数据绑定@BindingAdapter({"app:setCheckBoxListener"})
public static void setCheckBoxListener(AppCompatCheckBox checkBox, final OnCheckListener onCheckListener) {
checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
onCheckListener.onCheckChanged(isChecked, (String) buttonView.getText());
}
});
}
这是我用于逻辑部分的 ViewModel class。我希望当我选中复选框时,数据将保存在 ArrayList 中。
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;
import android.widget.Toast;
import com.codestrela.product.adapters.SelectContactAdapter;
import com.codestrela.product.data.Contact;
import com.codestrela.product.fragments.ListDialogFragment;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.ArrayList;
public class ListDialogViewModel {
private static final String TAG = "ListDialogViewModel";
public static final String CONTACT_LIST = "contact_list";
public RowSelectContactViewModel viewModel;
ListDialogFragment listDialogFragment;
ArrayList<RowSelectContactViewModel> selectViewmodel;
ArrayList<Contact> contacts;
public SelectContactAdapter adapter;
public ListDialogViewModel(ListDialogFragment listDialogFragment) {
this.listDialogFragment = listDialogFragment;
adapter = new SelectContactAdapter(new ArrayList<RowSelectContactViewModel>());
selectViewmodel = new ArrayList<>();
onContact();
}
public void onContact() {
contacts = new ArrayList<>();
SharedPreferences sharedPreferences = listDialogFragment.getActivity().getSharedPreferences("shared preference", Context.MODE_PRIVATE);
Gson gson = new Gson();
String json = sharedPreferences.getString(CONTACT_LIST, null);
Toast.makeText(listDialogFragment.getActivity(), "" + json, Toast.LENGTH_SHORT).show();
Type type = new TypeToken<ArrayList<Contact>>() {
}.getType();
contacts = gson.fromJson(json, type);
Log.e(TAG, "array size: " + contacts.toString());
for (int i = 0; i < contacts.size(); i++) {
viewModel = new RowSelectContactViewModel();
String name = contacts.get(i).getName();
viewModel.contactName.set(name);
viewModel.contactNumber.set(contacts.get(i).getNumber());
Toast.makeText(listDialogFragment.getActivity(), " check "+viewModel.contactCheckbox.get(), Toast.LENGTH_SHORT).show();
selectViewmodel.add(viewModel);
}
adapter.addAll(selectViewmodel);
}
}
这是我在应用程序的回收站视图中使用的行布局。这个复选框是我在应用程序中使用的。请帮助我,我是新手。
<?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="vm"
type="com.codestrela.product.viewmodels.RowSelectContactViewModel" />
</data>
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardCornerRadius="8dp"
android:layout_margin="8dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:checked="@{vm.contactCheckbox.get()}"
android:layout_alignParentLeft="true"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_margin="8dp"
android:layout_gravity="center">
<TextView
android:id="@+id/contact_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{vm.contactName}"
android:layout_gravity="center"
android:textSize="18dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{vm.contactNumber}"
android:textSize="14dp"
android:layout_marginTop="4dp"
android:layout_gravity="center"
/>
</LinearLayout></LinearLayout></androidx.cardview.widget.CardView>
</layout>
不用做BindingAdapter,太简单了
根据 docs of two-way data binding ,您只需将其添加到您的 xml
它提供设置复选框的初始状态和onCheckedChange
<CheckBox
android:id="@+id/rememberMeCheckBox"
android:checked="@={viewmodel.rememberMe}"
/>
你必须把它保存到布尔值变量
boolean contactCheckbox;
所以在你的 xml 中它将是
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:checked="@={vm.contactCheckbox}"
android:layout_alignParentLeft="true"/>
只需添加等号 =
.. 即可实现双向绑定