J'ai un fragment de fil dont l'élément principal est un RecyclerView de messages.
Je gère le recycleur avec la bibliothèque Groupie de Lisa Wray https://github.com/lisawray/groupie
Maintenant, dans mon graphique de navigation, j'ai une action reliant le fragment de flux à un autre fragment, et j'essaie d'appeler cette action avec un écouteur au clic que je crée dans la fonction de liaison de l'adaptateur.
val action=FeedFragmentDirections.actionDestinationFeedToDestinationAddToBucket(image.id) findNavController().navigate(action)
Je reçois un navigation destination XXXXX is unknown to this NavController
erreur indiquant que navigation destination XXXXX is unknown to this NavController
J'ai essayé d'ajouter quelques éléments avant findNavController()
, comme viewHolder.itemView
ou viewHolder.root
mais rien ne fonctionne.
Lorsque j'utilise viewHolder.itemView.rootView
j'obtiens cette erreur à la place. View DecorView@a190adf[MainActivity] does not have a NavController set
je ne sais pas ce qu'est DecorView.
Des idées sur la façon dont je peux mettre en œuvre correctement mes écouteurs oncick?
5 Réponses :
vous pouvez transmettre le fragment ou l'activité parent dans le constructeur de l'adaptateur de recylerview.
parentFragment.findNavController()
puis recherchez le navController à partir de votre objet parentFragment
class MyRecylerViewAdapter(...your other args.., val parentFragment: Fragment)
Ça a marché pour moi
MyRecylerViewAdapter(..., findNavController())
class MyRecylerViewAdapter(...your other args.., val findNavController: NavController)
il suffit de passer le contrôleur de navigation dans l'entrepreneur de la classe d'adaptateur recyclerview. exemple java
public RecyclerAdaptorMasseges(Context context, List<ConfirmationMessagesModuel> data, NavController navController) { inflate = LayoutInflater.from(context); this.data = data; this.navController = navController; Log.d("hex", " MsgRecyclerAdaptor"); }
L'utilisation d'itemView semble également fonctionner car c'est ce que j'ai sur mon code:
class RecyclerSettingsItem( private val activity: MainActivity, private val settingItem: String ) : Item<GroupieViewHolder>() { override fun bind(viewHolder: GroupieViewHolder, position: Int) { var navController: NavController? = null viewHolder.apply { with(viewHolder.itemView) { tvTitle.text = settingItem itemView.setOnClickListener { navController = Navigation.findNavController(itemView) navController!!.navigate(R.id.action_settingsFragment_to_contactTracingFragment) } } } } override fun getLayout() = R.layout.rv_settings_item_row }
vous pouvez utiliser 'requireView ()'
requireView().findNavController().navigate(R.id.your_action)
pouvez-vous dire dans quel fichier vous avez écrit
findNavController().navigate(action)
@Moinkhan que voulez-vous dire dans quel fichier? J'ai utilisé cette commande dans tous les fragments à partir desquels je navigue en utilisant le composant de navigation. J'ai essayé de résoudre le problème mais je n'ai pas trouvé de réponse à ce problème, alors j'ai un peu abandonné à ce stade, mais j'aimerais le comprendre car cela me permettrait plus de fonctionnalités
assurez-vous de trouver le contrôleur de navigation visible qui se trouve à l'intérieur de votre fragment d'hôte de navigation ...
J'essaie de trouver le contrôleur de navigation à partir d'un élément dans une vue de recyclage, qui se trouve à l'intérieur de mon fragment d'hôte de navigation
Essayez de trouver NavController à partir des vues parentes et non de l'élément.
@Tsabary Vous avez une solution pour ça?
Je pense que je dois aller avec ceci: github.com/lisawray/groupie/issues/253#issuecomment-48936302 8
@Pavitra J'ai abandonné le composant de navigation, cela m'a causé de nombreux problèmes. J'utilise maintenant un simple gestionnaire de fragments. Chaque élément de mon recyclerView a une référence à l'activité principale, et avec cette référence, je mets la main sur le gestionnaire de fragments et fais ce dont j'ai besoin
Consultez ce stackoverflow.com/a/59740737/6770917