除非在观察者方法中再次声明适配器,否则不会显示 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
方法。
我的 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
方法。