Связывание данных с Kotlin и дженериками.ошибка: несовместимые типы: объект не может быть преобразован в список - PullRequest
0 голосов
/ 23 ноября 2018

Я связываю List из Interfaces с аргументом типа через привязку данных.

Интерфейс:

public interface MyInterface<T> {

    T getValue();

}

ViewModel:

public class MyViewModel {

    public ObservableField<List<MyInterface>> name = new ObservableField<>();

}

BindingAdapter:

@android.databinding.BindingAdapter("bind")
public static void bind(TextView textView, List<MyInterface> list) {    
}

XML:

<data>

    <variable
            name="viewModel"
            type="com.example.myname.playground4.MyViewModel"/>

</data>


<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:bind="@{viewModel.name}"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>

Это работает, пока ViewModel находится на Java.

Когда я конвертирую ViewModel в Kotlin:

class MyKotlinViewModel {
    val name = ObservableField<List<MyInterface<*>>>()
}

Я получаю ошибку в моей ActivityMainBindingImpl.java:

Ошибка: несовместимые типы: объект не может быть преобразован в список

Вот ошибочный метод:

@Override
protected void executeBindings() {
    long dirtyFlags = 0;
    synchronized(this) {
        dirtyFlags = mDirtyFlags;
        mDirtyFlags = 0;
    }
    android.databinding.ObservableField viewModelName = null;
    java.util.List viewModelNameGet = null;
    com.example.fweigl.playground4.MyKotlinViewModel viewModel = mViewModel;

    if ((dirtyFlags & 0x7L) != 0) {



            if (viewModel != null) {
                // read viewModel.name
                viewModelName = viewModel.getName();
            }
            updateRegistration(0, viewModelName);


            if (viewModelName != null) {
                // read viewModel.name.get()
                viewModelNameGet = viewModelName.get(); // error is here
            }
    }
    // batch finished
    if ((dirtyFlags & 0x7L) != 0) {
        // api target 1

        com.example.fweigl.playground4.BindingAdapter.bind(this.mboundView0, viewModelNameGet);
    }
}

Кто-нибудь знает причину этого и / или как это исправить?

Вы можете попробовать сами с моим тестовым проектом @ https://github.com/fmweigl/playground4. (Рабочая) Java-версия находится на ветке 'master', (нерабочая) версия kotlin на ветке 'kotlin'.

1 Ответ

0 голосов
/ 26 ноября 2018

Я думаю, что ваша проблема связана с вашим BindingAdapter. В Kotlin вы должны добавить аннотацию @JvmStatic в начало вашего BindingAdapter.

Например:

@JvmStatic
@BindingAdapter("bind")
fun bind(recyclerView: RecyclerView, items: MutableList<SmartResult>) {
     //Anything that you wanna do ...
}

Потому что, когда вашViewModel и XML хотите использовать адаптер привязки, он должен быть статическим, как в java!

...