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

Android Kotlin中NavGraph传递列表数据报错:类型不匹配

解决NavGraph传递列表数据的类型不匹配问题

问题根源

你遇到的类型不匹配,核心是传递的数据类型、NavGraph参数定义、接收端及Adapter的期望类型三者不统一。结合你的代码,分两种常见场景给出解决方案:


场景1:传递单个Data对象,接收后用其内部的parkingRequests列表

这种情况适用于点击Data列表项,把单个Data对象传给目标Fragment,再取出里面的请求列表给Adapter。

步骤1:修正NavGraph参数定义

参数名改为更贴合的bookingRequest(单个对象),类型保持Data即可:

<argument
    android:name="bookingRequest"
    app:argType="com.jvm.di.model.parkingSpot.response.BookParkingResponse.Data" />

步骤2:传递数据

确保点击事件中的it是BookParkingResponse.Data类型:

// 点击项时传递单个Data对象
findNavController().navigate(MyParkFragmentDirections.toAllRequestListFragment(it))

步骤3:接收数据并适配Adapter

如果Adapter需要的是List<Data>:

private val args: AllRequestListFragmentArgs by navArgs()

allRequestListAdapter = AllRequestListAdapter()
rvItems.adapter = allRequestListAdapter
// 将单个Data对象包装成列表赋值
allRequestListAdapter.allParkingRequestList = listOf(args.bookingRequest)

如果Adapter实际需要的是ParkingRequests列表(对应错误提示的期望类型),先修改Adapter的类型定义:

// Adapter中修改列表类型
internal var allParkingRequestList: List<BookParkingResponse.Data.ParkingRequests> by Delegates.observable(
    emptyList()
) { _, _, _ -> notifyDataSetChanged() }

再在接收Fragment中取出parkingRequests(注意判空避免空指针):

private val args: AllRequestListFragmentArgs by navArgs()

allRequestListAdapter = AllRequestListAdapter()
rvItems.adapter = allRequestListAdapter
// 取出Data中的parkingRequests列表,为空时用空列表兜底
allRequestListAdapter.allParkingRequestList = args.bookingRequest.parkingRequests ?: emptyList()

场景2:直接传递ParkingRequests列表

如果需要一次性传递多个请求列表给目标Fragment,按以下步骤调整:

步骤1:修正NavGraph参数定义

传递列表时,argType必须用arraylist<>前缀包裹目标类型:

<argument
    android:name="bookingRequestList"
    app:argType="arraylist<com.jvm.di.model.parkingSpot.response.BookParkingResponse.Data.ParkingRequests>" />

步骤2:传递数据

确保it是List<BookParkingResponse.Data.ParkingRequests>类型:

// 传递ParkingRequests列表
findNavController().navigate(MyParkFragmentDirections.toAllRequestListFragment(it))

步骤3:接收数据

直接将参数赋值给Adapter即可:

private val args: AllRequestListFragmentArgs by navArgs()

allRequestListAdapter = AllRequestListAdapter()
rvItems.adapter = allRequestListAdapter
allRequestListAdapter.allParkingRequestList = args.bookingRequestList

额外注意事项

  • 确保所有传递的实体类都正确实现Parcelable:你的代码已经用@Parcelize标注,只需在Module的gradle中开启插件:
    plugins {
        id 'kotlin-parcelize'
    }
    
  • 修改NavGraph后,需重新编译项目,确保生成的Directions和Args类同步更新。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 14:20:23