除非在观察者方法中再次声明适配器,否则不会显示 recyclerview 中的项目

Items in recyclerview are not shown unless declaring adapter again in the observer methode

我的 adapter/recyclerview 有问题。我希望用户看到这样的约会概览:

但我只能在观察方法中为 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
    }
}

您不需要覆盖 getItemCount 方法。在您的情况下,data.size returns 0 由于这些项目从未显示。

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

class CalendarAdapter : ListAdapter<CalendarData, RecyclerView.ViewHolder>(AppointmentDiffCallback()) {

    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 = getItem(position)
        (holder as AppointmentViewHolder).bind(appointment)
    }
}

然后在您的观察者中,您可以像在问题的第二个代码块中那样使用 submitList 方法。