Android 除非在observer方法中再次声明适配器,否则不会显示recyclerview中的项

Android 除非在observer方法中再次声明适配器,否则不会显示recyclerview中的项,android,android-recyclerview,listadapter,Android,Android Recyclerview,Listadapter,我的适配器/回收器视图有问题。我希望用户可以看到如下约会概述: 但我只能通过在observe方法中设置recylerview的适配器来实现这一点。 这是代码: val adapter = CalendarAdapter() binding.appointmentList.adapter = adapter calendarDataViewModel?.appointments?.observe(viewLifecycleOwner, Obser

我的适配器/回收器视图有问题。我希望用户可以看到如下约会概述:

但我只能通过在observe方法中设置recylerview的适配器来实现这一点。 这是代码:

        val adapter = CalendarAdapter()

        binding.appointmentList.adapter = adapter

        calendarDataViewModel?.appointments?.observe(viewLifecycleOwner, Observer {
            it?.let {
                adapter.data = it
                binding.appointmentList.adapter = adapter
            }
        })
如您所见,如果我在observe方法中再次设置适配器,将显示项目,但如果我不这样做,将不会显示任何内容,它将只是一个空屏幕

我还尝试了以下代码,但这也不起作用:

val adapter = CalendarAdapter()

binding.appointmentList.adapter = adapter

calendarDataViewModel?.appointments?.observe(viewLifecycleOwner, Observer {
    it?.let {
            adapter.submitList(it)
            }
        })
我似乎不明白为什么这不起作用。 约会属于LiveData类型

有人知道我怎么解决这个问题吗

这是我的日历适配器:

class CalendarAdapter : ListAdapter<CalendarData, RecyclerView.ViewHolder>(AppointmentDiffCallback()) {
    var data = listOf<CalendarData>()

    override fun getItemCount(): Int {
        return data.size
    }
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        return AppointmentViewHolder(CalendarItemBinding.inflate(LayoutInflater.from(parent.context), parent, false))
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        val appointment = data[position]
        (holder as AppointmentViewHolder).bind(appointment)
    }
}

private class AppointmentDiffCallback : DiffUtil.ItemCallback<CalendarData>() {
    override fun areItemsTheSame(oldItem: CalendarData, newItem: CalendarData): Boolean {
        return oldItem.appointmentId == newItem.appointmentId
    }

    @SuppressLint("DiffUtilEquals")
    override fun areContentsTheSame(oldItem: CalendarData, newItem: CalendarData): Boolean {
        return oldItem == newItem
    }
}
class CalendarAdapter:ListAdapter(AppointmentDiffCallback()){
var data=listOf()
重写getItemCount():Int{
返回数据大小
}
override fun onCreateViewHolder(父级:ViewGroup,viewType:Int):RecyclerView.ViewHolder{
return AppointViewHolder(CalendarItemBinding.inflate(LayoutFlater.from(parent.context),parent,false))
}
覆盖onBindViewHolder(holder:RecyclerView.ViewHolder,位置:Int){
val任命=数据[职位]
(持有人作为委任人查看持有人)。绑定(委任)
}
}
私有类AppointDiffCallback:DiffUtil.ItemCallback(){
覆盖乐趣项相同(旧项:CalendarData,新项:CalendarData):布尔值{
返回oldItem.appointmentId==newItem.appointmentId
}
@SuppressLint(“DiffUtilEquals”)
覆盖内容相同(oldItem:CalendarData,newItem:CalendarData):布尔值{
返回oldItem==newItem
}
}

您不需要重写
getItemCount
方法。在您的情况下,
data.size
返回0,因此项目不会显示

另外,您不需要跟踪项目,
ListAdapter
abstract类已经做到了这一点。您可以使用
getItem(Int)
方法获取项目。您的适配器应该是这样的:

class CalendarAdapter:ListAdapter(AppointmentDiffCallback()){
override fun onCreateViewHolder(父级:ViewGroup,viewType:Int):RecyclerView.ViewHolder{
return AppointViewHolder(CalendarItemBinding.inflate(LayoutFlater.from(parent.context),parent,false))
}
覆盖onBindViewHolder(holder:RecyclerView.ViewHolder,位置:Int){
val约会=获取项目(职位)
(持有人作为委任人查看持有人)。绑定(委任)
}
}
然后在observer中,您可以使用问题中的第二个代码块中的
submitList
方法