Safe Args: use list of parcelables
Currently i don't think there is a simple way to use list of parcelables with safe args, But i have found some "hack" to make this work. For example, i have object 'User' and it parcelable, i am declaring a new parcelable object 'Users' that extending ArrayList().
@Parcelize
data class User(var name: String, val age: Int): Parcelable
@Parcelize
class Users: ArrayList<User>(), Parcelable
Now i can set 'Users' as argument in navigation
<argument
android:name="users"
app:argType="com.navigation.test.Users"/>
And passing array list of parcelables between destinations:
val user=User("Alex", 36)
val users= Users()
users.add(user)
val action=MainFragmentDirections.actionMainFragmentToSecondFragment(users)
NavHostFragment.findNavController(this@MainFragment).navigate(action)
And to retrieve them on other destination:
val users=SecondFragmentArgs.fromBundle(arguments).users
val user=users[0]
txtViewName.text=user.name
txtViewAge.text="${user.age}"
Update:
Support to list of objects coming in alpha8: https://issuetracker.google.com/issues/111487504
Update 2:
The approach mentioned above will not work in case the activity is recreated, as @Parcelize
will not be able to store/restore the list.
The object will be store in the state bundle, however, it will store an empty list of objects.
An improvement to @LaVepe suggestion: as for Android Studio 3.4.2 you can pass Parcelable array with in-built feature of navigation editor by specifying Arguments for chosen destination. Just check 'Array' option after choosing your custom Parcelable class which should not be wrapped in any collection beforehand:
EDIT Here how it looks in xml:
<argument
android:name="items"
app:argType="com.company.domain.Item[]" />
In your Fragment/Activity code you might strictly pass a typed array of model Parcelable items. If you have non-array collection and write in Kotlin, it may be achieved with (if you have list beforehand) list.toTypedArray()
.
Yes, since version 1.0.0-alpha08 you can now pass arrays of parcelable objects like this:
<argument
android:name="users"
app:argType="com.navigation.test.User[]"/>
For passing arrays of primitive types use for e.g. app:argType="integer[]"