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