自定义微调控件,数据绑定运行时在设置适配器时崩溃

问题描述 投票:0回答:1

我想使用这个带有数据绑定的自定义微调器,用我的列表绑定条目:https://github.com/miteshpithadiya/SearchableSpinner

一切都适用于标准微调器,示例xml布局:

 <android.support.v7.widget.AppCompatSpinner
                    android:id="@+id/add_event_internal_category_spinner"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_marginEnd="16dp"
                    android:layout_marginLeft="16dp"
                    android:layout_marginRight="16dp"
                    android:layout_marginStart="16dp"
                    android:layout_marginTop="@dimen/default_margin"
                    android:entries="@{event.internalCategoryNames}"
                    android:prompt="@string/spinner_category_title"
                    android:selectedItemPosition="@={event.selectedInternalCategoryPosition}"
                    android:visibility="@{event.editable?View.VISIBLE:View.GONE}"
                    app:layout_constraintHorizontal_bias="0.0"
                    app:layout_constraintLeft_toLeftOf="parent"
                    app:layout_constraintRight_toRightOf="parent"
                    app:layout_constraintTop_toBottomOf="@+id/textView6"/>

但是,如果我尝试使用可搜索的微调控件而不是标准微调器,我会得到一个例外:

java.lang.ClassCastException:android.databinding.adapters.ObservableListAdapter无法强制转换为android.widget.ArrayAdapter

控件尝试设置适配器,代码时抛出异常:

    @Override
    public void setAdapter(SpinnerAdapter adapter)
    {

        if (!_isFromInit)
        {
            _arrayAdapter = (ArrayAdapter) adapter; //--EXCEPTION
            if (!TextUtils.isEmpty(_strHintText) && !_isDirty)
            {
                ArrayAdapter arrayAdapter = new ArrayAdapter(_context, android.R.layout
                        .simple_list_item_1, new String[]{_strHintText});
                super.setAdapter(arrayAdapter);
            }
            else
            {
                super.setAdapter(adapter);
            }

        }
        else
        {
            _isFromInit = false;
            super.setAdapter(adapter);
        }
    }

ObservableListAdapter是私有包,因此无法使用。你知道什么是错的吗? SearchableSpinner延伸Spinner类:https://github.com/miteshpithadiya/SearchableSpinner/blob/master/searchablespinnerlibrary/src/main/java/com/toptoche/searchablespinnerlibrary/SearchableSpinner.java

android spinner classcastexception android-databinding
1个回答
0
投票

你得到了那个例外,因为android:entries的数据绑定系统标准绑定适配器使用并设置了ObservableListAdapter

AbsSpinnerBindingAdapter(无论是androidx还是android):

@BindingAdapter({"android:entries"})
public static <T> void setEntries(AbsSpinner view, List<T> entries) {
    if (entries != null) {
        SpinnerAdapter oldAdapter = view.getAdapter();
        if (oldAdapter instanceof ObservableListAdapter) {
            ((ObservableListAdapter) oldAdapter).setList(entries);
        } else {
            view.setAdapter(new ObservableListAdapter<T>(view.getContext(), entries,
                    android.R.layout.simple_spinner_item,
                    android.R.layout.simple_spinner_dropdown_item, 0));
        }
    } else {
        view.setAdapter(null);
    }
}

所以可以使用AppCompatSpinner(以及Spinner),但你使用的SearchableSpinner期望它是一个ArrayAdapter

您必须声明自己的绑定适配器,自定义setter,它使用ArrayAdapter。您可以为android:entries属性提供自己的属性(数据绑定系统将使用您的属性而不是标准属性),或者您创建一个新的属性名称并在XML中使用它(例如bind:entries)。如果你不知道如何,看看here

© www.soinside.com 2019 - 2024. All rights reserved.