【问题标题】:Items in recyclerview are not shown unless declaring adapter again in the observer methode除非在观察者方法中再次声明适配器,否则不会显示 recyclerview 中的项目
【发布时间】:2020-11-21 13:52:14
【问题描述】:

我的适配器/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
    }
}

【问题讨论】:

    标签: android android-recyclerview listadapter


    【解决方案1】:

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

    此外,您不需要跟踪您的项目,ListAdapter 抽象类已经这样做了。您可以使用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 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-11
      • 2021-10-12
      • 2017-11-25
      • 1970-01-01
      • 2017-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多