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(),可以移除该行代码。
额外优化建议
- 确保
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) } }
- 给
salesOptions添加长度判断,避免当salesRange长度超过salesOptions时出现数组越界异常。
内容的提问来源于stack exchange,提问作者NewPartizal
相关产品推荐
相关产品推荐

