You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中List更新后RecyclerView Adapter未显示问题求助

问题分析

你的代码核心问题是错误绕开了ListAdapter的内置数据管理机制:

  • 你给Adapter构造函数传入salesRange参数,并且在getItemCount、bind方法里直接使用这个参数,完全忽略了ListAdapter通过submitList传入的实际数据
  • Activity初始化Adapter时传入了emptyList(),这个值会一直绑定在Adapter实例中,后续调用submitList并不会更新Adapter内部的salesRange变量,所以日志显示salesRange始终是[]
解决方案

修改ProfileStatisticAdapter,移除构造函数中的salesRange参数,改用ListAdapter提供的currentList和getItem()方法来获取数据:

class ProfileStatisticAdapter(
    private val itemClickListener: ((Int) -> Unit)? = null
) : ListAdapter<String, ProfileStatisticAdapter.StatisticViewHolder>(StatisticDiffCallback) {

    private val salesOptions = listOf(
        "last 1 day sale",
        "last 7 day sale" ,
        "last 30 day sale"
    )

    override fun getItemCount(): Int {
        Log.d("ProfileStatistics", "currentList size: ${currentList.size}")
        return currentList.size
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = StatisticViewHolder(
        ItemStatisticSellingBinding.inflate(parent.context.inflater, parent, false)
    )

    override fun onBindViewHolder(holder: StatisticViewHolder, position: Int) {
        holder.bind(getItem(position), position)
    }

    inner class StatisticViewHolder(
        private val binding: ItemStatisticSellingBinding
    ) : RecyclerView.ViewHolder(binding.root) {

        fun bind(salesValue: String, position: Int) = with(binding) {
            tvSalesReport.text = salesOptions[position]
            tvSalesPrice.text = salesValue
            root.setOnClickListener { itemClickListener?.invoke(bindingAdapterPosition) }
        }
    }

    object StatisticDiffCallback : DiffUtil.ItemCallback<String>() {
        override fun areItemsTheSame(oldItem: String, newItem: String): Boolean {
            return oldItem == newItem
        }

        override fun areContentsTheSame(oldItem: String, newItem: String): Boolean {
            return oldItem == newItem
        }
    }
}

同时修改Activity中Adapter的初始化代码:

private val statisticAdapter: ProfileStatisticAdapter by lazy {
    ProfileStatisticAdapter()
}

注意:submitList方法本身会自动触发RecyclerView的更新,不需要额外调用notifyDataSetChanged(),可以移除该行代码。

额外优化建议
  1. 确保uiState.salesRange不为null时再调用submitList,避免传入null导致异常:
private fun renderView(uiState: StatisticsUiState) = with(binding) {
    viewModel.userLiveData.value?.let { user ->
        tvUserName.text = user.userName.orEmpty()
    }

    uiState.salesRange?.let {
        statisticAdapter.submitList(it)
    }
}
  1. 给salesOptions添加长度判断,避免当salesRange长度超过salesOptions时出现数组越界异常。

内容的提问来源于stack exchange,提问作者NewPartizal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 23:55:31