Привязка данных Android вводит ViewModel в пользовательском представлении - PullRequest
0 голосов
/ 03 мая 2018

Я отказываюсь от ответа на стекопоток https://stackoverflow.com/a/34817565/4052264, чтобы связать объект данных с пользовательским представлением. Однако после того, как все настроено, мое представление не обновляется данными, и вместо этого TextView остается пустым. Вот мой код (упрощенно для удобства здесь):

activity_profile.xml

<layout xmlns...>
    <data>
        <variable name="viewModel" type="com.example.ProfileViewModel"/>
    </data>
    <com.example.MyProfileCustomView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:viewModel="@{viewModel}">
</layout>


view_profile.xml

<layout xmlns...>
    <data>
        <variable name="viewModel" type="com.example.ProfileViewModel"/>
    </data>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@{viewModel.name}">
</layout>

1012 *
*

MyProfileCustomView.kt:

class MyProfileCustomView : FrameLayout {
    constructor...

    private val binding: ViewProfileBinding = ViewProfileBinding.inflate(LayoutInflater.from(context), this, true)

    fun setViewModel(profileViewModel: ProfileViewModel) {
        binding.viewModel = profileViewModel
    }
}



ProfileViewModel.kt

class ProfileViewModel(application: Application) : BaseViewModel(application) {
    val name = MutableLiveData<String>()

    init {
        profileManager.profile()
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(::onProfileSuccess, Timber::d)
    }

    fun onProfileSuccess(profile: Profile) {
        name.postValue(profile.name)
    }
}

Все работает нормально, API-вызов к profileManager.profile() выполнен успешно, класс ViewProfileBinding успешно создан с правильной настройкой. Проблема в том, что когда я делаю name.postValue(profile.name), представление не обновляется со значением profile.name

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Ответ помог мне, и я хочу добавить метод util, который можно добавить, чтобы получить LifeCycleOwner

fun getLifeCycleOwner(view: View): LifecycleOwner? {
    var context = view.context

    while (context is ContextWrapper) {
        if (context is LifecycleOwner) {
            return context
        }
        context = context.baseContext
    }

    return null
}

На ваш взгляд:

getLifeCycleOwner(this)?.let{
   binding.setLifecycleOwner(it)
}
0 голосов
/ 03 мая 2018

Недостающим элементом является Владелец жизненного цикла .

binding.setLifecycleOwner(parent) //parent should be a fragment or an activity
...