java - 自定义可观察集合android

标签 java android data-binding collections

我刚刚了解了 Android 上的 beta Databinding 库。我浏览了开发人员指南,但我仍然不确定如何将微调器绑定(bind)到自定义集合。问题是,这是否可能。


以下是使一切正常运行的步骤。

  • 创建一个扩展 ObservableList.OnListChangedCallback 的类。
  • 我们想要绑定(bind)到微调器(或其他基于适配器的 View )的自定义集合应该扩展 ObservableList(或其兄弟)并具有 addOnListChangedCallback(onListChangedCallback olcc)。
  • 创建一个适用于我们的自定义集合的自定义适配器。 ObservableList.OnListChangedCallback 应该在我们想要监听的事件中通知适配器。
  • 在开发人员指南中创建相应 View 的 xml 注释:数据部分中的 import + 变量和微调器的 app:adapter=。
  • 使用@BindingAdapter() 注释为我们的自定义适配器创建自定义静态 setter 。

最佳答案

Spinner 没有属性 android:entries 所以这不是将值绑定(bind)到 Spinner 的方法。 我是这是错误的,即使我实现了它!

entries 属性采用 CharSequence 数组。如果您希望它采用任意集合:

@BindingAdapter({"android:entries"})
public static void setEntries(AbsSpinner view, List<String> entries) {
    if (entries != null) {
        SpinnerAdapter oldAdapter = view.getAdapter();
        boolean changed = true;
        if (oldAdapter != null && oldAdapter.getCount() == entries.size()) {
            changed = false;
            for (int i = 0; i < entries.size(); i++) {
                if (!entries.get(i).equals(oldAdapter.getItem(i))) {
                    changed = true;
                    break;
                }
            }
        }
        if (changed) {
            ArrayAdapter<String> adapter =
                    new ArrayAdapter<String>(view.getContext(),
                            android.R.layout.simple_spinner_item,
                            entries.toArray(new String[entries.size()]);
            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            view.setAdapter(adapter);
        }
    } else {
        view.setAdapter(null);
    }
}

您可能应该使用 ObservableList 而不是 List 并添加一个监听器,以便在每次值更改时更新您的 ArrayAdapter。

因为它是一个 AdapterView,所以您通常会使用 setAdapter() 方法。因此,您可以使用自动生成的属性app:adapter="@{myAdapter}"来使用setAdapter()方法。

如果你想使用像“条目”这样的自定义属性,你可以使用 BindingAdapter 创建一个。在您的应用程序的一个类中——哪个类并不重要,但按照惯例,它们按目标 View 类型分组:

public class SpinnerAdapter {
    @BindingAdapter("entries")
    public static void setEntries(Spinner view, final List<String> values) {
        SpinnerAdapter spinnerAdapter = new SpinnerAdapter() {
            // Use values to implement the SpinnerAdapter
        }
        view.setAdapter(spinnerAdapter);
    }
}

如果您想使用自定义集合,请将 List 替换为您的自定义集合类型。如果您希望它是可观察的,适配器支持数据更改通知,因此请确保将监听器添加到您提供的任何列表(例如 ObservableList)并通知适配器更改。

关于java - 自定义可观察集合android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32310483/

相关文章:

java - 我们如何交换数组中的两个元素?

java - Apache FOP 和 xsi :schemaLocation - how to ignore?

android - Android开发中的设计模式原则是什么?

c# - 使用 InteractiveDataDisplay.WPF 导出图形

java - 使用java从sql server存储过程中检索返回值

android - 将数据库从云端下载到 Android

android - 无法使用带有 stripwhitespace 选项的 libGDX 纹理打包器打包分辨率为 800x800 的图像?

java - HTML java 数据绑定(bind)

c# - 用于指定属性或字段的显示格式的属性

java - 当单元测试覆盖率低于多模块项目中预先配置的限制时,maven 构建失败