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

RecyclerView.Adapter的onCreateViewHolder的viewType参数始终为0问题求解

问题原因

你当前遇到的onCreateViewHolder收到的viewType始终为0的核心原因如下:

  • 你的Adapter直接持有LiveData实例但没有注册数据观察者,当LiveData的数据从初始状态变更为Success状态时,Adapter无法感知数据变化,不会触发列表刷新流程
  • 初始状态下getItemCount返回0,RecyclerView不会调用getItemViewType方法,自然不会收到你返回的100,只会使用默认的viewType值0
  • 额外排查点:如果重写getItemViewType时没有加override关键字,会导致方法没有真正重写父类逻辑,父类RecyclerView.Adapter的getItemViewType默认返回0,从你给出的代码来看已经加了override,可以排除这个问题

解决方案

你可以按照以下步骤修改代码:

  1. 在Adapter的初始化逻辑中为传入的listItemsLD添加观察者,当数据变更时主动调用notifyDataSetChanged通知RecyclerView刷新,示例代码如下:
init {
    listItemsLD.observe(iAbsListFragment as LifecycleOwner) {
        notifyDataSetChanged()
    }
}

注意:需要确保iAbsListFragment实现了LifecycleOwner接口,通常Fragment默认已经实现

  1. 若后续需要支持多视图类型,需要将Adapter的泛型改为所有ViewHolder的共同父类(可以直接用RecyclerView.ViewHolder),并在onCreateViewHolder中根据viewType返回对应的ViewHolder实例:
// 修改Adapter继承声明
class OrdersAdapter(val iAbsListFragment: IAbsListFragment,
                    val listItemsLD: LiveData<Result<List<Order>>>
) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        return when(viewType) {
            100 -> OrderViewHolder(
                LayoutInflater.from(parent.context)
                    .inflate(R.layout.card_order, parent, false), iAbsListFragment
            )
            // 其他viewType对应返回其他ViewHolder实例
            else -> OtherViewHolder(/*对应布局和参数*/)
        }
    }
}
  1. 排查其他边缘问题点:
  • 确认没有为RecyclerView设置自定义LayoutManager时重写了getItemViewType相关逻辑,覆盖了Adapter返回的值
  • 不要在Adapter外部主动调用修改viewType的相关方法干扰默认逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 20:36:00