【发布时间】:2017-07-28 17:44:19
【问题描述】:
我现在尝试在我的项目中使用android数据绑定,并遇到这种问题,例如:我有3个复选框作为复选框组,如果选中第一个复选框,则变量type为1 . 第二个使type 变为2,第三个使type 变为3。所以我以这种方式实现代码。
// layout.xml
<android.support.v7.widget.AppCompatCheckBox
android:layout_width="50dp"
android:layout_height="50dp"
android:checked="@{userInfoViewModel.type == 1}"
android:onCheckedChanged="@{(compoundButton, checked) -> userInfoViewModel.onTypeChecked(checked, 1)}"
/>
<android.support.v7.widget.AppCompatCheckBox
android:layout_width="50dp"
android:layout_height="55dp"
android:checked="@{userInfoViewModel.type == 2}"
android:onCheckedChanged="@{(compoundButton, checked) -> userInfoViewModel.onTypeChecked(checked, 2)}"
/>
<android.support.v7.widget.AppCompatCheckBox
android:layout_width="50dp"
android:layout_height="55dp"
android:checked="@{userInfoViewModel.type == 3}"
android:onCheckedChanged="@{(compoundButton, checked) -> userInfoViewModel.onTypeChecked(checked, 3)}"
/>
// viewModel
public void onTypeChecked(boolean checked, int i) {
if (checked) {
// if it is a check. set the type
type.set(i);
} else {
// if it is a uncheck. set type to unknown
type.set(0);
}
}
现在的问题是,如果我选中了第一个复选框,那么我会选中第二个。 type 应设置为 2,并且 UI 应正确更新。但实际情况是uncheck事件也发生在第一个checkbox上,type设置为2后,type.set(0)被触发,所以没有checkbox。
其实这个问题和onCheckedChanged called automatically是一样的。我需要的是数据绑定的解决方案。
在非数据绑定项目中,我认为最好的解决方案是使用setCheckedSilent(@Emanuel Andrada 回答)。
public void setCheckedSilent(boolean checked) {
super.setOnCheckedChangeListener(null);
super.setChecked(checked);
super.setOnCheckedChangeListener(listener);
}
但在数据绑定中,我不能这样做。那么有没有高手可以帮帮我?
根据@Arpan Sharma 的回答,听onClick 而不是onCheckedChanged。这个解决方案目前有效,但我担心checked 的值,它总是正确的吗?
public void onTypeChecked(View view, int i) {
Boolean checked = ((CheckBox) view).isChecked();
if (checked) {
type.set(i);
} else {
type.set(0);
}
}
【问题讨论】:
标签: android checkbox data-binding android-databinding