LiveData не обновляется при изменении видимости?

Основная деятельность

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    activityMainBinding = DataBindingUtil.setContentView(this, 
 R.layout.activity_main)
    mainViewModel = ViewModelProviders.of(
        this@MainActivity,
        mainViewModelFactory
    )[MainViewModel::class.java]
    activityMainBinding.viewmodel = mainViewModel
    activityMainBinding.lifecycleOwner =   this

        mainViewModel.fetchBusinessList()
mainViewModel.businessList.observe(this, Observer { items ->
        run {
          mainViewModel.isLoading.value = false
        }
    })

MainViewModel

class MainViewModel(val repository: MainActivityRepo) : ViewModel() {

val isLoading: MutableLiveData<Boolean> = MutableLiveData()
lateinit var businessList: LiveData<List<Content>>

fun fetchBusinessList() {
    isLoading.value = true
    businessList = repository.getBusinessList()
}

Макет

    <androidx.core.widget.ContentLoadingProgressBar
        android:id="@+id/clp_fetching"
        style="@style/Widget.AppCompat.ProgressBar"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:visibility="@{viewmodel.isLoading?View.VISIBLE:View.GONE}"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

Я пробовал setValue, postValue, а также добавил LifeCycleOwner, это не влияет на видимость на false.


person Manoj Perumarath    schedule 14.10.2019    source источник
comment
Я не вижу в вашем вопросе кода, связанного с postValue или видимостью.   -  person Vivek Mishra    schedule 14.10.2019
comment
Бро, пожалуйста, посмотри на последнюю строку, я пробовал все варианты, установка на true работает нормально. @ВивекМишра   -  person Manoj Perumarath    schedule 14.10.2019
comment
VIew.GONE. Я вижу ошибку в верхнем регистре, когда я вижу   -  person Vivek Mishra    schedule 14.10.2019
comment
Исправил, это опечатка при копировании вопроса, проблема не в этом. @ВивекМишра   -  person Manoj Perumarath    schedule 14.10.2019
comment
попробуйте вызвать executePendingBinding()   -  person Vivek Mishra    schedule 14.10.2019
comment
Прочтите, пожалуйста, о NetworkBoundResource, чтобы не вызывать такие методы, как fetchBusinessList(), из Activity, которые должны быть внутренними по отношению к методу LiveData.onActive.   -  person EpicPandaForce    schedule 14.10.2019


Ответы (2)


Вы должны вызывать executePendingBindings() вручную всякий раз, когда вы меняете значение isLoading.

Или вы можете использовать пользовательский адаптер привязки для достижения этой функциональности:

@BindingAdapter("mutableVisibility")
fun setMutableVisibility(view: View, visibility: MutableLiveData<Boolean>?) {
    val parentActivity: AppCompatActivity? = view.getParentActivity()
    if (parentActivity != null && visibility != null) {
        visibility.observe(parentActivity, Observer { value -> view.visibility = if(value) View.VISIBLE else View.GONE})
    }
}

затем в вашем макете:

<androidx.core.widget.ContentLoadingProgressBar
        android:id="@+id/clp_fetching"
        style="@style/Widget.AppCompat.ProgressBar"
        android:layout_width="40dp"
        android:layout_height="40dp"
        app:mutableVisibility="@{viewmodel.isLoading}"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
person Md. Asaduzzaman    schedule 14.10.2019
comment
В приведенном выше фрагменте кода вы не использовали executePendingBindings - person Manoj Perumarath; 15.10.2019
comment
Нет, нет необходимости. он автоматически обрабатывается, наблюдая за LiveData - person Md. Asaduzzaman; 15.10.2019
comment
executePendingBindings() следует использовать в соответствии с вашей реализацией, а не моей - person Md. Asaduzzaman; 15.10.2019

Некоторые наблюдения относительно пользователя ViewModel

Вы пытаетесь обновить свойство в модели представления из действия, чего не следует делать.

Посмотреть модель

class MainViewModel(val repository: MainActivityRepo) : ViewModel() {

val isLoading: MutableLiveData<Boolean> = MutableLiveData()
lateinit var businessList: LiveData<List<Content>>

fun fetchBusinessList() {
    isLoading.value = true
    businessList = repository.getBusinessList()
}

// This is where you the content of the list would be received
fun onListUpdated(contentList : List<Content>){
    businessList.value = contentList;
    isLoading.value = false;
 }

Мероприятия

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
    activityMainBinding = DataBindingUtil.setContentView(this, 
 R.layout.activity_main)
    mainViewModel = ViewModelProviders.of(
        this@MainActivity,
        mainViewModelFactory
    )[MainViewModel::class.java]
    activityMainBinding.viewmodel = mainViewModel
    activityMainBinding.lifecycleOwner =   this

        mainViewModel.fetchBusinessList()
mainViewModel.businessList.observe(this, Observer { items ->
        // Update UI Here
    })
person Dinesh    schedule 14.10.2019
comment
изменить val на var нет причин для этого - person EpicPandaForce; 14.10.2019