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