- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我需要了解数据绑定(bind)库如何确定其 BindingAdapter 的执行顺序。如果一个View有两个BindingAdapters,如果这个View有这两个BindingAdapters对应的属性,那么它如何确定先执行哪个adapter呢?我问是因为执行顺序对我来说很重要。
我有以下 BindingAdapter/s:
public class SpinnerBindingAdapter {
@BindingAdapter(value = {"entries"})
public static void setEntries(Spinner spinner, List<? extends SpinnerItem> spinnerItems) {
for (int i = 0; i < spinnerItems.size(); i++) {
spinnerItems.get(i).setIndex(i);
}
ArrayAdapter<? extends SpinnerItem> adapter =
new ArrayAdapter<>(spinner.getContext(), R.layout.spinner_item, spinnerItems);
spinner.setAdapter(adapter);
}
@InverseBindingAdapter(attribute = "selectedItem", event = "selectedItemAttrChanged")
public static Object getSelectedItem(Spinner spinner) {
Object selectedItem = spinner.getSelectedItem();
return selectedItem;
}
@BindingAdapter(value = {"selectedItem"})
public static void setSelectedItem(Spinner spinner, SpinnerItem spinnerItem) {
if (spinner.getAdapter() == null) {
return;
}
// Other code omitted for simplicity
}
@BindingAdapter(value = {"selectedItemAttrChanged"}, requireAll = false)
public static void setOnItemSelectedListener(Spinner spinner, final InverseBindingListener selectedItemChange) {
if (selectedItemChange == null) {
spinner.setOnItemSelectedListener(null);
} else {
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
selectedItemChange.onChange();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
}
}
下面是我如何填充 Spinner 并设置选择:
<Spinner
android:id="@+id/spinner_system_activity_edit_tracker_unit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="fill_horizontal"
app:entries="@{DatabaseModel.queryForAll()}"
app:selectedItem="@={object.selectedItem}"/>
DatabaseModel.queryForAll 是一个静态方法,它查询数据库并返回对象列表,然后将其提供给 BindingAdapter。 BindingAdapter 获取此列表,用索引更新它的每个项目并将其设置为微调器的适配器。
无论出于何种原因,“setSelectedItem”BindingAdapter 总是首先被调用。这是不可取的,因为我需要先初始化条目。如果它没有首先初始化,那么在第一次调用 setSelectedItem 时 spinner.getAdapter() 将为空。这意味着之前保存的选择将不会恢复。
最佳答案
Android 数据绑定(bind)中没有保证的执行顺序。因此,您应该合并依赖于多个属性的绑定(bind)适配器。在您的情况下,您需要合并 selectedItem 和条目的绑定(bind)适配器。
@BindingAdapter(value = {"selectedItem", "entries"}, requireAll = false)
public static void setSelectedItem(Spinner spinner, SpinnerItem spinnerItem,
List<? extends SpinnerItem> spinnerItems) {
// Set entries attribute when provided
if (spinnerItems != null) {
for (int i = 0; i < spinnerItems.size(); i++) {
spinnerItems.get(i).setIndex(i);
}
ArrayAdapter<? extends SpinnerItem> adapter =
new ArrayAdapter<>(spinner.getContext(), R.layout.spinner_item, spinnerItems);
spinner.setAdapter(adapter);
}
// set selectedItem attribute when provided
if (spinnerItem != null) {
if (spinner.getAdapter() == null) {
return;
}
// Other code omitted for simplicity
}
}
关于Android BindingAdapter 的执行顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40932933/
我有一个项目,其中每个功能都是它自己的模块。 我已经定义了一些自定义数据绑定(bind) BindingAdapter s 在主应用程序模块中,但无法从其他模块访问它们。 我通常会收到此错误:Cann
我正在尝试将自定义绑定(bind)添加到我的 TextView .请在下面找到我的代码MainActivity.kt import android.os.Bundle import androidx.
我使用 BindingAdapter 来实现对 TextInputLayout 字段的验证。我的对象有一个 ObservableBoolean '有效',当更改时将执行我的绑定(bind)适配器以设置
我在 android 中使用 DataBinding 并且我有一个自定义 View :CarouselView 我为此编写了一个绑定(bind)适配器: @BindingAdapter("onClic
匹配ObservableList至 @BindingAdapter用 ObservableList 声明行为怪异。 我在 MVVM 的上下文中试用 android 数据绑定(bind)库,偶然发现了一
我需要了解数据绑定(bind)库如何确定其 BindingAdapter 的执行顺序。如果一个View有两个BindingAdapters,如果这个View有这两个BindingAdapters对应的
我有一个按钮: ... BindingAdapter 如下所示: @BindingAdapter("binding:singleParameterSt
这是我的 BindingAdapter @InverseBindingMethods({ @InverseBindingMethod(type = RecyclerView.class
这是我的BindingAdapter: public class Bindings{ @BindingAdapter({"font"}) public static void setF
我刚刚学习如何在 Android 上使用数据绑定(bind)。我想问为什么 BindingAdapter必须设置为静态方法?如果我能让它成为非静态方法。我必须做什么?我需要将我的图像加载到我自己的 I
我在 android 中创建了一个自定义 bindingAdapter,当我传入颜色时,我希望颜色发生变化,这实际上是为了测试我正在进行的工作,只是为了确保它能正常工作。这是代码:这是我的数据绑定(b
我有一个几乎简单的想法:我想使用数据绑定(bind) API 和 BindingAdapter 为微调器生成一个适配器。这是我要使用的 XML: 这里的地址是一个简单的类,它有一个名为 countr
这必须是最基本的问题,但经过一整天的阅读教程和文档 here我似乎无法理解将这些方法放在哪里。没有任何指南提到这个东西的放置位置,它只是提到在静态方法上使用注释。什么静态方法?任何静态方法都不管类吗?
在我的 Android 项目中,我使用以下 BindingAdapter连接OnLongClickListener到 View 及其对应的 View 模型。 @JvmStatic @BindingAd
将我的 Android 应用 Java 代码转换为 Kotlin,我正在使用数据绑定(bind)将自定义字体设置为 TextViews。我曾经从 XML 传递字体字符串,如下所示 app:custom
我写了一个自定义BindingAdapter当 Chip 上的关闭图标时被点击: @BindingAdapter("onCloseClicked") fun Chip.onCloseClicked(o
我正在创建一个多模块项目。我想在模块中共享 BindingAdapter。但是,出现以下错误。 com.github.takahirom.bindingadapter_in_library.datab
通过 Android 数据绑定(bind),我可以执行以下操作: viewModel.onClick()}" /> 我的ViewModel不必实现OnClickListener,而只是有一个方法:
我想使用绑定(bind)创建电影海报图像的 GridView 。 我的 View 模型看起来像这样: public class PopularMoviesViewModel extends BaseO
两者有什么区别? 什么时候应该使用其中之一? 当我定义一个 BindingAdapter 时,我是否必须创建一个反函数? 最佳答案 引用我自己的话,来自The Busy Coder's Guide t
我是一名优秀的程序员,十分优秀!