android - 观察者的内部 View 模型不触发

标签 android

在我的 View 模型中创建内部实时数据观察器并将其与数据绑定(bind)连接时,我遇到了一个问题。现在我的部分代码看起来像这样: fragment :

类 SearchFragment : Fragment(), Injectable {

@Inject lateinit var viewModelFactory: ViewModelProvider.Factory
@Inject lateinit var searchViewModel: SearchViewModel

private lateinit var disposable: Disposable
private var searchView: SearchView? = null
private var adapter: SearchCityListAdapter? = null

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    val binding: SearchFragmentBinding = DataBindingUtil.inflate(inflater, R.layout.search_fragment, container, false)
    binding.apply { viewModel = searchViewModel
    setLifecycleOwner(this@SearchFragment)}
    setHasOptionsMenu(true)
    return binding.root
}

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    searchViewModel = ViewModelProviders.of(this, viewModelFactory).get(SearchViewModel::class.java)
    submitViewModel()
}

    private fun submitViewModel(){
    viewModel.searchCityList.observe(this, Observer {it ->
        if (adapter == null){
            it?.let { adapter = SearchCityListAdapter(it)}.also {createAdapter()}
        } else {
            it?.let { adapter!!.updateList(it) }.also { adapter!!.notifyDataSetChanged() }
        }
    })
    viewModel.responseStatus.observe(this, Observer {
        it?.let { it ->
            when(it.status){
            Status.SUCCESS -> progressBar.visibility = View.INVISIBLE
            Status.FAILURE -> progressBar.visibility = View.INVISIBLE
            Status.ERROR -> progressBar.visibility = View.INVISIBLE
            Status.LOADING ->progressBar.visibility = View.VISIBLE
        } }
    })
}

View 模型:

class SearchViewModel @Inject constructor(val haloApplication: HaloApplication): ViewModel() {

val progressBarVisibility: MediatorLiveData<Boolean> = MediatorLiveData()
private val responseStatus: MutableLiveData<Response> = MutableLiveData()
val searchCityList: MutableLiveData<SearchCityList> = MutableLiveData()


fun searchCity(cityName: String){
    haloApplication.networkRepository.fetchCityList(cityName, responseStatus, searchCityList)
}

init {
    progressBarVisibility.value = false
    progressBarVisibility.addSource(responseStatus){
        it?.let { when(it.status) {
            Status.FAILURE -> progressBarVisibility.value = false
            Status.ERROR -> progressBarVisibility.value = false
            Status.SUCCESS -> progressBarVisibility.value = false
            Status.LOADING -> progressBarVisibility.value = true
        } }
    }
}

XML 布局文件:

<?xml version="1.0" encoding="utf-8"?>
<layout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools">

    <data>
        <variable
                name="viewModel"
                type="com.mbojec.halo.viewmodel.SearchViewModel"/>
    </data>

<FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".ui.SearchFragment">

    <ProgressBar
            style="?android:attr/progressBarStyle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/progressBar"
            android:layout_gravity="center"
            android:visibility="@{viewModel.progressBarVisibility, default=invisible}"/>


    <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/searchCityListRecycleView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

</FrameLayout>
</layout>

数据绑定(bind)文件:

import android.view.View
import androidx.databinding.BindingAdapter

@BindingAdapter("android:visibility")
fun setVisibility(view: View, value: Boolean) {
    view.visibility = if (value) View.VISIBLE else View.INVISIBLE
}

由于某些未知原因,Fragment 部分工作正常,但当 responseStatus 发生变化并且通过数据绑定(bind)的连接无用时,viewmodel 部分永远不会触发。这不是我第一次创建调解员的 View 模型或转换,但这是我第一次遇到这样的问题。我尝试了十几个场景,每次结果都是一样的。首先我要归咎于新的 AndroidX 库,但他们来自 github 的 Sunflower Sample 也能正常工作,所以我对这一刻一无所知。

最佳答案

MediatorLiveData 只有在观察到 MediatorLiveData 本身时才开始观察通过 addSource 添加的源。由于没有任何东西在观察 progressBarVisibility,因此您不会收到任何回调。

关于android - 观察者的内部 View 模型不触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54499027/

相关文章:

android - 如何在 Android 应用程序中将文本字段(用户输入)数据保存在文本文件中

java - 如何在android中的textview上随机生成24个字符串值?

Java从长文本中检测特殊模式

java - 如何使用 Java/Android 与 REST API 进行通信?

android - 捏缩放自定义 View

android - 在android studio中隐藏滚动 Activity 标题

android - Android编程资源推荐

android - 使用 RxAndroid 处理 onKeyDown

android - 带有圆角、描边和选择器图标的自定义微调器

java - 如何将NameValuePair传递给android中的另一个 Activity ?