未观察到Android ViewModel不可观测

未观察到Android ViewModel不可观测,android,kotlin,Android,Kotlin,我正在创建一个使用Android架构组件导航和ViewModel的应用程序。它有一个到片段的导航,作为选项卡布局,菜单称为MyProductFragment,在这个MyProductFragment中有MyProductItemFragment和MyProductCategoryFragment。MyProductItemFragment显示产品目录列表,category显示类别,场景是当我单击类别时,它将调用对数据库的查询来过滤数据,并将过滤后的数据转换为viemodel,然后MyProduc

我正在创建一个使用Android架构组件导航和ViewModel的应用程序。它有一个到片段的导航,作为选项卡布局,菜单称为MyProductFragment,在这个MyProductFragment中有MyProductItemFragment和MyProductCategoryFragment。MyProductItemFragment显示产品目录列表,category显示类别,场景是当我单击类别时,它将调用对数据库的查询来过滤数据,并将过滤后的数据转换为viemodel,然后MyProductItemFragment将观察到这一点,但它似乎不起作用。 这是我的MyProduct片段oncreate

override fun onCreateView(inflater: LayoutInflater,
                          container: ViewGroup?, savedInstanceState: Bundle?): View? {
    val productViewModel = ViewModelProviders.of(context as FragmentActivity)[ProductViewModel::class.java]
    productViewModel.setProductList(null)
    val root = inflater.inflate(R.layout.fragment_menus_my_product, container, false)

    ToolKt.loadFragment(myProductItemFragment, childFragmentManager,savedInstanceState)

    val tabLayout = root.findViewById<TabLayout>(R.id.tab_layout)
    InitToolbar.setTabLayout(tabLayout) { tab ->
        if (tab.position == 0) {
            ToolKt.loadFragment(myProductItemFragment, childFragmentManager)
        } else if (tab.position == 1) {
            ToolKt.loadFragment(myProductCategoryFragment, childFragmentManager)
        }
    }

    return root
}
我的视图模型

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    val token = SharedPrefManager.getInstance(requireContext()).merchantInfo
    val idMerchant = ToolKt.getIdMerchant(token)!!
    var productList:List<ProductModel>?=null
    val viewmodel = ViewModelProviders.of(context as FragmentActivity)[ProductViewModel::class.java]
    viewmodel.getProductList().observe(this, Observer {
        productList = it
    })
    if(productList.isNullOrEmpty()){
        doAsync {
            productList = RoomSingleton.getInstance(requireContext()).productDao().gets(idMerchant)
            val productAdapter = ProductAdapter(productList!!,{ item:ProductModel->onItemClick(item)})
            Log.e("PC",productList.toString())
            activity?.runOnUiThread(Runnable {
                RecyclerViewManagement.setAdapterLinearVerticalDivider(requireContext(),rv_product,productAdapter)
            })
        }

    }
    else{
        val productAdapter = ProductAdapter(productList!!,{ item:ProductModel->onItemClick(item)})
        RecyclerViewManagement.setAdapterLinearVerticalDivider(requireContext(),rv_product,productAdapter)
    }

    return inflater.inflate(R.layout.fragment_item_product, container, false)
}
class ProductViewModel:ViewModel() {
private val productList = MutableLiveData<List<ProductModel>>()
fun getProductList(): LiveData<List<ProductModel>> {
    return productList
}
fun setProductList(data:List<ProductModel>?){
    productList.value=data
}
class ProductViewModel:ViewModel(){
private val productList=MutableLiveData()
fun getProductList():LiveData{
退货产品清单
}
fun setProductList(数据:List?){
productList.value=数据
}
}


一切正常,数据也已过滤,唯一的问题是过滤后的数据未被观察到,有什么问题吗?

LiveData
遵循观察者模式,这意味着当其值发生变化时,适当的
观察者会得到通知,因此它可以根据新值执行一些任务:

val liveData: MutableLiveData<Int> = MutableLiveData()

liveData.observe(owner, Observer {
    println(it) // when the value changes, the Observer prints it
})

liveData.value = 2
// printed: 2

liveData.value = 3
// printed: 3

您好,您可以分享您的视图模型类吗?@DeepakRajput我已经更新了我的问题,请检查它。您可以在您的视图模型类中尝试以下操作:productList.postvalue(数据)并像这样观察:viewmodel.getProductList().observe(这个,observator{productList=it})仍然不工作吗
val liveData: MutableLiveData<Int> = MutableLiveData()

liveData.observe(owner, Observer {
    println(it) // when the value changes, the Observer prints it
})

liveData.value = 2
// printed: 2

liveData.value = 3
// printed: 3
viewmodel.getProductList().observe(this, Observer {
    productList = it

    if(productList.isNullOrEmpty()){
        doAsync {
            productList = RoomSingleton.getInstance(requireContext()).productDao().gets(idMerchant)
            val productAdapter = ProductAdapter(productList!!, { item:ProductModel -> onItemClick(item) })
            Log.e("PC", productList.toString())
            activity?.runOnUiThread(Runnable {
                RecyclerViewManagement.setAdapterLinearVerticalDivider(requireContext(), rv_product, productAdapter)
            })
        }
    } else {
        val productAdapter = ProductAdapter(productList!!, { item: ProductModel -> onItemClick(item) })
        RecyclerViewManagement.setAdapterLinearVerticalDivider(requireContext(), rv_product, productAdapter)
    }

})