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,可以排除这个问题
解决方案
你可以按照以下步骤修改代码:
- 在Adapter的初始化逻辑中为传入的
listItemsLD添加观察者,当数据变更时主动调用notifyDataSetChanged通知RecyclerView刷新,示例代码如下:
init { listItemsLD.observe(iAbsListFragment as LifecycleOwner) { notifyDataSetChanged() } }
注意:需要确保iAbsListFragment实现了LifecycleOwner接口,通常Fragment默认已经实现
- 若后续需要支持多视图类型,需要将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(/*对应布局和参数*/) } } }
- 排查其他边缘问题点:
- 确认没有为RecyclerView设置自定义LayoutManager时重写了
getItemViewType相关逻辑,覆盖了Adapter返回的值 - 不要在Adapter外部主动调用修改viewType的相关方法干扰默认逻辑
内容的提问来源于stack exchange,提问作者snailp4el
相关产品推荐
相关产品推荐

