如何通过 NavComp 片段参数传递任何类型的通用列表

How to Pass Generic List of Any Type Through NavComp Fragment Args

我正在将项目从许多活动转换为一个 activity 具有许多片段并使用导航组件来执行此操作。有一个 activity 接受大约 10 个所有不同类型的不同列表的多个列表。在为要传递给片段的参数创建参数时,如何为可以是任何类型列表的参数执行此操作?

这是我在 onCreate 中从 activity 中获取它的方法。

intent.getParcelableArrayListExtra<Parcelable>("listItems")

我知道当我将它发送到片段时我将不得不做这样的事情

val bundle = bundleOf("ListItems" to (list as ArrayList<out Parcelable>))
findNavController().navigate(R.id.action, bundle)
          

safeArgs只支持自定义parcelable和自定义数组parcelable.

我们不能使用导航组件传递通用列表,但我们可以传递 parcelable 的数组,我们可以使用 toTypedArray()

将通用列表转换为数组

在导航图中,将参数类型更改为目标片段中自定义 parceablearray

<fragment
        android:id="@+id/destinationFragment"
        android:name="com.example.destinationFragments"
        android:label="destinationFragment"
        tools:layout="@layout/fragment_destination" >
        <argument
            android:name="test"
            app:argType="com.example.data.Test[]" />
 </fragment>

现在,您可以在将通用列表转换为 TypedArray

后发送它
 val action = HomeFragmentDirections.actionHomeFragmentToDestinationFragment(list.toTypedArray())
 findNavController().navigate(action)

您可以使用 savedStateHandlebundle

在目标片段中接收此内容

使用bundle

val args: DestinationFragmentArgs by navArgs()

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    val passesDataArray = args.test //here is your array of custom parcelable
}

所以我最终这样做了。对我来说它有点老套,但只要列表不是很大,它就会一直工作。

binding.button.setOnClickListener {
    val bundle = bundleOf("ListItems" to (list as ArrayList<out Parcelable>))
    findNavController().navigate(R.id.action_home_to_see_list, bundle)
}

然后在片段中我将此数据传递给我只是这样做

val list = arguments?.getParcelableArrayList<ListItems>("ListItems")?.toList()

对这个解决方案不满意,因为它对我来说很老套,但它确实有效