web-dev-qa-db-fra.com

Composant de navigation dans l'adaptateur RECYCLERVIEW

J'ai écrit la pièce de code suivante dans l'adaptateur.

holder.itemView.setOnClickListener {
    val action = SearchFragmentDirections.actionSearchFragmentToArtistFragment(artist.id)
    Navigation.createNavigateOnClickListener(action)
}

Et c'est la navigation XML de mai:

 ...
    <fragment Android:id="@+id/searchFragment"
          Android:name="com.salmanseifian.spotiny.ui.search.SearchFragment"
          Android:label="SearchFragment">

    <action Android:id="@+id/action_searchFragment_to_artistFragment"
            app:destination="@id/artistFragment"
            app:popUpTo="@+id/searchFragment"/>
</fragment>

mais ça ne marchera pas. Quelqu'un peut-il aider?

10
salmanseifian

Vous utilisez Lambda qui est lui-même un auditeur click. Vérifiez ceci Navigation Docs qui a une implémentation appropriée de Click Lister à l'aide d'ID de navigation et de CreateAnavigationListener.

Utilisez ci-dessous le code pour votre cas.

holder.itemView.setOnClickListener(
Navigation.createNavigateOnClickListener(R.id.action_searchFragment_to_artistFragment)
)

Ou, essayez de cette façon

holder.itemView.setOnClickListener{ view ->
 view.findNavController().navigate(R.id.action_searchFragment_to_artistFragment)
}
4
Rajnish suryavanshi

si vous utilisez la base de données, vous venez de

val Action = MessagelistFragmentDirections.ActionsMessagelistFragmentTosearchFragment () Binding.FindnavController (). Naviguer (Action)
0
Suân Chường

Dans votre adaptateur RECYCLERVIEW OnBindViewHolder méthode Vous pouvez l'avoir de cette façon:

        holder.bookBtn.setOnClickListener(view -> {
            Bundle bundle = new Bundle();
            String salonJsonString = 
            HelperMethods.getGsonParser().toJson(salonModel);bundle.putString("SALON_DETAILS", salonJsonString);
            Navigation.findNavController(view).navigate(R.id.salonDetailFragment,bundle);     
        });

Dans ce qui précède, la destination est SalonDetailFragment dont l'identifiant est salonDetailFragment et de transmettre des données sous forme de Bundle à la destination.

Ma configuration de navigation

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:id="@+id/mobile_navigation"
    Android:label="Salon"
    app:startDestination="@+id/nav_home">
    <fragment
        Android:id="@+id/nearbySalonsFragment"
        Android:name="my.package.NearbySalonsFragment"
        Android:label="Nearby Salons"
        tools:layout="@layout/fragment_nearby_salons" >
        <action
            Android:id="@+id/action_nearbySalonsFragment_to_salonDetailFragment"
            app:destination="@id/salonDetailFragment" />
    </fragment>
    <fragment
        Android:id="@+id/salonDetailFragment"
        Android:name="my.package.SalonDetailFragment"
        Android:label="Salon Details"
        tools:layout="@layout/fragment_salon_detail" />
</navigation>
0
ovicko

Essayez de communiquer avec votre navigation via votre fragment. Donc, il suffit simplement de créer un rappel de votre adaptateur vers un fragment/activité et du fragment/activité Essayez d'utiliser des méthodes de navigation comme de manière ordinaire.

0
aLT

Exemple dans Kotlin

désolé de mon anglais

Essayez de faire une interface de clic et d'utiliser à l'intérieur de l'adadérapeur, vous pouvez prendre la position de l'article.

exemple ==> Interface

interface MyInterface {
    fun OnClickListener( string : String , position: Int, view: View)
}

Comment utiliser à l'intérieur de l'adaptateur

class ProductAdadapter(
    val context: Context,
    private var myInterface : MyInterface 
    ) : RecyclerView.Adapter<ProductAdadapter.ProductViewModel>() {


    override fun onCreateViewHolder(
        parent: ViewGroup,
        viewType: Int
    ): ProductViewModel {
        val view = LayoutInflater.from(context).inflate(R.layout.item_product_adapter, parent, false)
        return ProductViewModel(view)
    }

    override fun getItemCount() =  product.size

    override fun getItemViewType(position: Int): Int {
        return super.getItemViewType(position)
    }


    override fun onBindViewHolder(holder: ProductViewModel, position: Int) {
        holder.bindView(product[position])

        holder.mcvProductsAd.setOnClickListener{
            myInterface .OnClickListener(product[position],position, it)
        }
    }


    class ProductViewModel(item: View) : RecyclerView.ViewHolder(item) {
        val mcvProductsAd = item.mcv_products_ad

        fun bindView(product: Product) {
            Glide.with(itemView.context).load(product.image).into(imageProduct)
        }
    }
}

ensuite et juste faire un outil à l'intérieur du fragment

class ProductFragment : Fragment(), MyInterface {

    lateinit var productAdadapter: ProductAdadapter


    companion object {
        fun newInstance() = ProductFragment()
    }

    private lateinit var viewModel: ProductViewModel

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.product_fragment, container, false)
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        viewModel = ViewModelProviders.of(this).get(ProductViewModel::class.Java)

        viewModel.loadMessages().observe(viewLifecycleOwner, androidx.lifecycle.Observer {
            it?.let {
                grid.layoutManager = GridLayoutManager(context!!, 2)
                grid.adapter = ProductAdadapter(context!!, it, this)
            }
        })

        mt_product_new.setOnClickListener { activity!!.onBackPressed() }
    }

    override fun OnClickListener(string: String, position: Int, view: View) {
        Navigation.findNavController(it)
           .navigate(R.id.action_my_orders_fragment_to_offers_fragment, null)
         }

    }

}
0
Jose alves

Je pense qu'il est préférable d'ajouter ceci à la réponse acceptée:

holder.itemView.setOnClickListener(
 Navigation
 .createNavigateOnClickListener(R.id.action_searchFragment_to_artistFragment).onClick(holder.itemView)
)
0
A.sobhdel

si vous utilisez la vue de la vie, ceci est pâte

view.btnCategory.setOnClickListener {
    val navController= Navigation.findNavController((view.root.context) as Activity, R.id.nav_Host_home)
    navController.navigate(R.id.action_movieFragment2_to_settingsFragment2)
}
0
Candra Ibra