7
votes

Comment utiliser le composant de navigation avec des clics provenant d'éléments RecyclerView?

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?


9 commentaires

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


5 Réponses :


2
votes

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)


0 commentaires

1
votes

Ça a marché pour moi

MyRecylerViewAdapter(..., findNavController())
class MyRecylerViewAdapter(...your other args.., val findNavController: NavController)


0 commentaires

3
votes

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");

}


0 commentaires

3
votes

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

}


0 commentaires

0
votes

vous pouvez utiliser 'requireView ()'

     requireView().findNavController().navigate(R.id.your_action)


0 commentaires