Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 更改可见性时是否不更新LiveData?_Android_Data Binding_Android Livedata_Android Mvvm - Fatal编程技术网

Android 更改可见性时是否不更新LiveData?

Android 更改可见性时是否不更新LiveData?,android,data-binding,android-livedata,android-mvvm,Android,Data Binding,Android Livedata,Android Mvvm,主要活动 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main) mainViewModel = ViewModelProviders.of( this@MainActi

主要活动

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()
}
class MainViewModel(val存储库:MainActivityReporto):ViewModel(){
val isLoading:MutableLiveData=MutableLiveData()
lateinit var业务列表:LiveData
有趣的商业列表(){
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的可见性。

关于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;
 }

无论何时更改
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})
    }
}
@BindingAdapter(“可变可见性”)
fun setMutableVisibility(视图:视图,可见性:MutableLiveData?){
val parentActivity:AppCompatActivity?=view.getParentActivity()
if(parentActivity!=null&&visibility!=null){
可见性.observe(父活动,观察者{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" />


我在你的问题中看不到任何
postValue
或与可见性相关的代码。请看最后一行,我已经尝试了所有选项,设置为true效果很好。@VivekMishra
VIew.Goe
。我在视图中看到I的大写错误更正了,这是复制问题时的键入错误,这不是问题。@ViVEKMISHARTRY调用executePendingBinding()“将
val
更改为
var
”在上面的代码段中,没有理由这样做,您没有使用
executePendingBindings
不,没有必要。它通过观察LiveData自动处理
executePendingBindings()
应该根据您的实现使用,而不是我的实现
<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" />