Android notifyDataSetChanged未更新视图

Android notifyDataSetChanged未更新视图,android,android-viewmodel,Android,Android Viewmodel,我在recycler视图中使用viewModel,但仅当我进入并存在屏幕而不是屏幕本身时,它才不会更新: override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) viewModel = ViewModelProvider(requireActivity()).get(RideDataViewModel::class.java)

我在recycler视图中使用viewModel,但仅当我进入并存在屏幕而不是屏幕本身时,它才不会更新:

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    viewModel = ViewModelProvider(requireActivity()).get(RideDataViewModel::class.java)

    rideList.adapter = MyRideListItemRecyclerViewAdapter(viewModel.rides.value!!, object : OnItemClickListener {
        override fun onItemClicked(ride: RideEntity) {
            viewModel.setRide(ride)
            findNavController().navigate(R.id.rideDataFragment)
        }
    })

    viewModel.rides.observe(viewLifecycleOwner, {

        if (it.isNotEmpty()) 
        {
            no_rides.visibility = View.GONE
           rideList.adapter!!.notifyDataSetChanged() //Function called but no visible data
        }
        else
        {
            no_rides.visibility = View.VISIBLE
        }
    })


    lifecycleScope.launch {
        viewModel.setRides(DataBaseHelper.getAllRidesFromDB())
    }
}
视图模型:

class RideDataViewModel : ViewModel() {
    
        var rides= MutableLiveData<List<RideEntity>>(listOf())
        fun setRides(item: List<RideEntity>) {
            rides.postValue(item)
    }
}

您不显示适配器代码,但在调用notifyDataSetChanged之前,需要使用it引用设置适配器基础数据/列表


您不显示适配器代码,但在调用notifyDataSetChanged之前,需要使用it引用设置适配器基础数据/列表


您在哪里设置适配器上的列表?在LiveData observer中,您只调用notifyDataSetChanged,这只会使RecyclerView重新绘制项目,但您没有先设置项目,因此它没有任何要重新绘制的内容

我不知道你的适配器是什么样子,但是下面的代码应该会让它更新

if (it.isNotEmpty()) {
    no_rides.visibility = View.GONE
    rideList.adapter!!.list = it              // Update the list in the adapter
    rideList.adapter!!.notifyDataSetChanged() // Now this will have something to draw
}

您在哪里设置适配器上的列表?在LiveData observer中,您只调用notifyDataSetChanged,这只会使RecyclerView重新绘制项目,但您没有先设置项目,因此它没有任何要重新绘制的内容

我不知道你的适配器是什么样子,但是下面的代码应该会让它更新

if (it.isNotEmpty()) {
    no_rides.visibility = View.GONE
    rideList.adapter!!.list = it              // Update the list in the adapter
    rideList.adapter!!.notifyDataSetChanged() // Now this will have something to draw
}

谢谢,但我正在构造函数中设置数据:MyrieDelistItemRecycleServiceAdapterViewModel.rides.value!!当导航到新片段并返回到此片段时,代码也可以工作one@Dim该数据当时很可能是空的。只有当您观察它时,才会给它一个值,并且只在创建适配器后调用setRides。这可以通过使用断点并确定viewModel.rides.value!!当您实例化适配器时。如果它有一个值,那么我建议在实例化适配器时使用适配器代码更新您的问题viewModel.rides.value为空,您是对的。但是我把它装满了,然后打电话给你notifyDataSetChanged@Dim没错,所以当您的观察者使用新数据触发时,您需要更新适配器,正如我的回答所示。实例化时传递给适配器的值不会改变,如何改变?这不是魔术lol,你需要用新数据设置你的适配器,即更新适配器的基础列表,然后调用notifyDataSetChangedThank,但我正在构造函数中设置数据:MyridelistItemRecycleServiceAdapterViewModel.rides.value!!当导航到新片段并返回到此片段时,代码也可以工作one@Dim该数据当时很可能是空的。只有当您观察它时,才会给它一个值,并且只在创建适配器后调用setRides。这可以通过使用断点并确定viewModel.rides.value!!当您实例化适配器时。如果它有一个值,那么我建议在实例化适配器时使用适配器代码更新您的问题viewModel.rides.value为空,您是对的。但是我把它装满了,然后打电话给你notifyDataSetChanged@Dim没错,所以当您的观察者使用新数据触发时,您需要更新适配器,正如我的回答所示。实例化时传递给适配器的值不会改变,如何改变?这不是神奇的lol,您需要使用新数据设置适配器,即更新适配器的基础列表,然后调用notifyDataSetChangedYou ObserviewModel.rides,对结果不做任何操作,您没有更新适配器。或者,您可能认为适配器构造函数中的viewModel.rides.value与viewModel.rides.observe中的结果具有相同的引用,并且应该包含新列表?您观察viewModel.rides,但对结果不做任何处理,您没有更新适配器。或者您可能认为适配器构造函数中的viewModel.rides.value与viewModel.rides.observe中的结果具有相同的引用,并且应该包含新列表?