Android 除非在observer方法中再次声明适配器,否则不会显示recyclerview中的项
我的适配器/回收器视图有问题。我希望用户可以看到如下约会概述: 但我只能通过在observe方法中设置recylerview的适配器来实现这一点。 这是代码: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
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
方法