Passer un lambda via NavController.navigate [kotlin] - Android - Programmation
Marsh Posté le 03-11-2020 à 08:49:56
Salut,
Continuant à analyser mon problème, j'ai cru comprendre que c'était l'argument de mon lambda (à savoir JSONObject) qui posait problème. Lorsque j'utilise :
Code :
|
Il va me sérialiser l'ensemble de mon objet et, lorsqu'il tombe sur mon type JSONObject, il ne sait pas faire car JSONObject n'est pas sérialisable...
Sur le net, certains parlent de convertir le JSONObject en string dans l'objet, puis de le reconvertir en JSONObject par la suite. Mais je trouve ce fonctionnement particulièrement lourd.
De plus, mon objet utilise aussi des arguments de type View, et là : impossible de convertir en string...
Marsh Posté le 03-11-2020 à 15:07:18
Bon ben je me réponds encore à moi-même
J'ai trouvé une solution. En fait j'ai déclaré dans ma classe DataListFragment une interface :
Code :
|
J'ai ensuite fait hériter mon activité de cette interface afin d'y surcharger les méthodes qu'elle contient :
Code :
|
Et enfin, dans mon Adapter (auquel j'ai fourni le context de l'activité), j'ai juste à tester si le context hérite de mon interface DataListBundle :
Code :
|
Le tout fonctionne à merveille et ne me semble ni moche ni lourd
Marsh Posté le 29-10-2020 à 11:26:52
Bonjour,
J'ai créé un fragment générique qui se contente d'initialiser une vue (RecyclerView + Adapter). Les données de l'adapter sont récupérées via un webservice que j'attaque par l'intermédiaire de la librairie Volley.
Sur mon activité principale, j'utilise un NavController et la méthode navigate() afin de naviguer d'une page à une autre (mais toujours au travers du fragment générique). Lors de la navigation, j'envoi un paramètre "action" et un paramètre "id" qui permettront de spécifier auprès du webservice les données à récupérer.
Ce fonctionnement marche bien.
Seulement maintenant, il faut que je puisse faire des traitements spécifiques selon les pages où je me trouve. Dans mon fragment, j'ai donc déclaré une méthode "setOnTouch" que j'utilise pour initialiser l'événement qui se produira lorsque l'utilisateur touchera un élément de ma RecyclerView :
Ma question est la suivante : comment passer une méthode (lambda) via la méthode navigate() :
J'ai essayé simplement ceci :
Mais ça marche pas... J'ai essayé de créer une classe qui hérite de Bundle, pour créer une propriété "onTouch" mais impossible : la classe Bundle est déclarée par Google comme Final...
J'ai ensuite créé une data classe de type Parcelable :
Puis dans mon activité :
Et dans mon fragment récupérer la fonction comme ceci :
Mais à chaque fois j'ai cette fichue erreur "IOException writing serializable object" qui, à mon avis, signifie qu'on ne peut pas sérialiser le type (result: JSONObject) -> Unit...
Je suis un peu à court d'idées... Certainement dû au fait que je débute en Kotlin et que je suis loin de maitriser encore les principaux concepts...
De l'aide ne serait pas de refus