【问题标题】:Custom observable collection android自定义可观察集合android
【发布时间】:2015-08-31 11:45:31
【问题描述】:

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


以下是使所有工作正常的步骤。

  • 创建一个扩展 ObservableList.OnListChangedCallback 的类。
  • 我们想要绑定到微调器(或其他基于适配器的视图)的自定义集合应该扩展 ObservableList(或其兄弟)并具有 addOnListChangedCallback (onListChangedCallback olcc)。
  • 创建一个与我们的自定义集合一起使用的自定义适配器。 ObservableList.OnListChangedCallback 应该在我们想要监听的事件时通知适配器。
  • 创建,编写在开发者指南中,对相应视图的 xml 进行注释:数据部分中的导入 + 变量和微调器中的 app:adapter=。
  • 使用 @BindingAdapter() 注释为我们的自定义适配器创建自定义静态设置器。

【问题讨论】:

  • 你尝试过什么吗?
  • 是的,我目前正在检查,是否可以将数据绑定与 'android:entries = "@{some_collection}"' 一起使用
  • developer.android.com/tools/data-binding/guide.html - 本指南非常清楚如何做事。还有一段处理 observables。
  • 没有关于自定义集合、将微调器绑定到集合或其他基于适配器的视图的内容。

标签: java android data-binding collections


【解决方案1】:

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

entry 属性采用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 创建一个。在你的应用程序的一个类中——不管是哪个类,但按照惯例,它们是按目标视图类型分组的:

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)并通知适配器更改。

【讨论】:

  • 当然可以! Spinner 扩展了具有“条目”属性的 AbsSpinner。但这不会使答案错误。我也试试看
  • @GeorgeMount 你能帮帮我吗?那我如何将它用于 FragmentPagerAdapter
  • @GeorgeMount 我一直想知道如何使用 ObservableList 创建条目:stackoverflow.com/questions/45881669/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-02
  • 2011-04-25
相关资源
最近更新 更多