Android Kotlin中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
相关产品推荐
相关产品推荐

