【问题标题】:LiveData not updating when changing visibility?更改可见性时 LiveData 不更新?
【发布时间】:2020-02-10 16:59:33
【问题描述】:

主活动

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
        }
    })

主视图模型

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" />

我尝试过setValuepostValue,还添加了LifeCycleOwner,它不会影响可见性为false。

【问题讨论】:

  • 我在您的问题中看不到任何postValue 或可见性相关代码
  • 兄弟请看最后一行,我已经尝试了每个选项,设置为 true 工作正常。 @VivekMishra
  • VIew.GONE。我看到 I in view 出现大写错误
  • 更正了,这是复制问题时的打字错误,这不是问题所在。 @VivekMishra
  • 尝试调用 executePendingBinding()

标签: android data-binding android-livedata android-mvvm


【解决方案1】:

关于 ViewModel 用户的一些观察

您正在尝试从 Activity 更新视图模型中的属性,但您不应该这样做。

查看模型

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
    })

【讨论】:

  • "将 val 更改为 var" 没有理由这样做
【解决方案2】:

每当您更改isLoading 的值时,您都必须手动调用executePendingBindings()

或者您可以使用自定义绑定适配器来实现此功能:

@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" />

【讨论】:

  • 在上面的代码sn -p你没用过executePendingBindings
  • 不,不需要。它通过观察 LiveData 自动处理
  • executePendingBindings() 应该根据你的实现使用而不是我的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-23
  • 1970-01-01
  • 2017-07-09
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 2021-03-12
相关资源
最近更新 更多