1
votes

Appeler une intention à partir de l'adaptateur peut-être par InterationListener

On m'a dit qu'il était préférable de démarrer une autre activité à partir de l'activité principale au lieu de la démarrer à partir de l'adaptateur et que je devrais utiliser un InteractionListener pour communiquer avec l'adaptateur et appeler l'intention à partir de l'activité principale.

Problème est-ce que je ne comprenais pas comment implémenter un InteractionListener.

J'ai essayé ceci https://developer.android.com/training/basics/fragments/communicating mais je ne sais pas comment initialiser le rappel.

J'ai essayé de le faire comme j'étais dit mais je suis débutant et je n'ai pas compris ce tutoriel, j'ai des erreurs que je n'ai pas pu résoudre.

interface OnAdapterInteractionListener {
    fun itemSelected(/Some Parameters Maybe/)
}


class ItemRecyclerViewAdapter(
    private val mListener: OnFragmentInteractionListener?
) :  {
    // set on click listener from item to OnAdapterInteractionListener.itemSelected(/* Maybe Item Argument/)


class MainActivity: Activity(), OnFragmentInteractionListener {
    override fun itemSelected(/ Some Parameters*/ ) {
        startAct....
    }
}

Je veux juste appeler une activité en cliquant sur certains éléments de ma vue recycleur .

J'apprécie vraiment toute aide ou suggestion que vous pouvez fournir.


0 commentaires

4 Réponses :


0
votes

Vous devez gérer le clic d'élément d'un adaptateur. Reportez-vous à la réponse détaillée ici Transmission de données depuis une activité à l'interaction d'une autre activité

Surtout l'utilisation de TaskItemListener dans l'exemple.


0 commentaires

0
votes

C'est assez simple et direct. Vous devez créer une interface pour agir en tant qu'auditeur et l'implémenter dans votre activité. Ensuite, vous devez transmettre cette implémentation / référence à l'adaptateur pour accéder à la méthode d'interface depuis l'adaptateur.

Désolé, c'est en java . Mais vous pouvez suivre la même méthode

Créer et interfacer. Vous pouvez le créer dans l'adaptateur / en tant que classe distincte (je le crée dans mon adaptateur)

viewHolder.mBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    callback.onAdapterSelected(i);
                }


   });

Et dans l'activité.

public MyAdapter(ArrayList<Student> data, AdapterCallback callback) {
            this.callback = callback;
            this.myList = data;
        }


0 commentaires

1
votes

Supposons que vous ayez une liste de noms ( String s) et que vous vouliez les afficher sous forme de liste. Lorsqu'un de ces noms est cliqué, vous devez afficher l'élément sur lequel vous avez cliqué (nom) dans une autre activité . Vous pouvez l'implémenter comme suit.

Votre fichier activity_main.xml :

intent?.getStringExtra("name").also {
    detailText.text = it
}

Adapter ItemRecyclerViewAdapter , sous-classe de RecyclerView.Adpater , qui nécessite list of Strings comme argument de constructeur et qui est capable d'accepter OnAdapterInteractionListener ( Edit: strong > Placé à l'intérieur de l'adpater) pour interagir avec l'activité ou le fragment:

class MainActivity : AppCompatActivity() {

    private lateinit var mAdapter: ItemRecyclerViewAdapter
    private val names: ArrayList<String> = ArrayList()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        recyclerView.layoutManager = LinearLayoutManager(this)
        initNames()
        mAdapter = ItemRecyclerViewAdapter(names)
        mAdapter.setOnAdapterInteractionListener(object : ItemRecyclerViewAdapter.OnAdapterInteractionListener {
            override fun itemSelected(name: String, position: Int) {
                Intent(this@MainActivity, DetailActivity::class.java).also {
                    it.putExtra("name", name)
                    startActivity(it)
                }
            }
        })

        recyclerView.adapter = mAdapter
    }

    private fun initNames() {
        names.add("Name1")
        names.add("Name2")
        names.add("Name3")
    }
}

Et la classe MainActivity :

class ItemRecyclerViewAdapter(private val names: List<String>)
    : RecyclerView.Adapter<ItemRecyclerViewAdapter.MyViewHolder>() {

    private var nameClickListener: OnAdapterInteractionListener? = null

    fun setOnAdapterInteractionListener(listener: OnAdapterInteractionListener) {
        nameClickListener = listener
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.item_name, parent, false)

        return MyViewHolder(view)
    }

    override fun getItemCount(): Int {
        return names.size
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        holder.tvName.text = names[position]
    }


    inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

        val tvName: TextView = itemView.findViewById(R.id.tvName)

        init {
            itemView.setOnClickListener {
                nameClickListener?.itemSelected(names[adapterPosition], adapterPosition)
            }
        }
    }

    interface OnAdapterInteractionListener {

        fun itemSelected(name: String, position: Int)
    }
}


5 commentaires

Salut, merci pour la réponse! Où dois-je mettre l'interface? dans un autre fichier kotlin?


Il est préférable de mettre dans ItemRecyclerViewAdapter sous la classe interne MyViewHolder . J'ai édité ma réponse @AndreAndriole


Im obtenant une référence non résolue avec adapter.setOnAdapterInteractionListener dans l'activité principale. mais je l'ai dans l'adaptateur, je ne sais pas pourquoi il n'est pas résolu


Etrange que cela fonctionne sur un objet compagnon mais là je ne peux pas "onClickListener = listener"


Avez-vous résolu le problème, @AndreAndriole? Si c'est le cas, veuillez marquer la réponse comme correcte en cliquant sur la coche à côté, merci!



0
votes

Aucune des réponses n'a aidé. Je pense qu'ils ont tous du java pour qu'ils ne fonctionnent pas.

Cela dit, j'ai résolu le problème en:

dans la déclaration de l'adaptateur

var ctx: Context? = null
```kotlin

in the listener inside adapter
```kotlin
(ctx as MainActivity).openProject()
```kotlin


in the listener inside adapter
```kotlin
fun openProject() {
        val intent = Intent(this, ProjectActivity::class.java)
        this.startActivity(intent)
    }
```kotlin

Well that solved my problem for now. If you know if doing an InterationListener insted is optimal or something please coment, thx.

p >


0 commentaires