[JAVA] Modifier le traitement lorsque le bouton de RecyclerView est enfoncé pour chaque liste

introduction

Vous utilisez RecyclerView pour créer un affichage de liste dans le développement d'applications Android, n'est-ce pas? Lorsque vous configurez un bouton sur RecyclerView et que vous passez d'une liste à un autre écran, vous voudrez peut-être savoir ** quel nombre de boutons de la liste a été enfoncé **. Sur RecyclerView.Adapter, "quel bouton numéro a été enfoncé" peut être obtenu assez rapidement, mais j'étais un peu accro à son utilisation dans MainActivity, alors prenez note.

À propos de RecyclerView

Pour un aperçu, veuillez vous référer à cet article car il était facile à comprendre. Principes de base de RecyclerView

Chose que tu veux faire

--Je veux placer un bouton sur RecyclerView et changer d'écran lorsque le bouton est enfoncé. --Je souhaite modifier le comportement à la destination de la transition en fonction du nombre de lignes dans la liste où le bouton est enfoncé.

L'image du traitement lorsque le bouton au moment de la transition d'écran est enfoncé est comme ceci. Je voudrais vous dire quelle liste de boutons a été enfoncée pour l'écran de destination de la transition.

En passant, RecyclerView.Adapter n'hérite pas de la classe Activty, donc la transition d'écran n'est pas possible. Par conséquent, il est nécessaire de connaître le numéro de la liste appuyée sur MainActivity et de changer d'écran.

MainActivity


@Override                                                                             
public void onClick(View view) {                                                      
    int line = getLine(); //Je veux obtenir le nombre de lignes dans la liste sur laquelle j'ai appuyé d'une manière ou d'une autre
    Intent hoge = new Intent(MainActivity.this, HogeActivity.class);
    hoge.putExtra("line", line);                   
    startActivity(hoge);                                                              
}    

Tout d'abord

Je souhaite traiter sur MainActivity lorsque j'appuie sur le bouton inclus dans RecyclerView. Enregistrez OnClickListener de MainActivity dans l'écouteur de RecyclerView.Adapter. Vous pouvez maintenant définir l'écouteur pour qu'OnClick () sur MainActivty soit appelé lorsque vous appuyez sur un bouton de la liste.

RecyclerAdapter.java


public void setOnItemClickListener(View.OnClickListener listener){
        m_listener = listener;
}

public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    // - get element from your dataset at this position
    // - replace the contents of the view with that element
    final int pos = position;
    //Lorsque le bouton de la liste est enfoncé, l'écouteur de clic enregistré ci-dessus sera appelé.
    holder.m_btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            m_listener.onClick(view);
        }
    });
}

MainActivity.java


RecyclerView.Adapter rAdapter = new RecycleAdapter(data);
rAdapter.setOnItemClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        int line = getLine(); //Je veux obtenir le nombre de lignes dans la liste sur laquelle j'ai appuyé d'une manière ou d'une autre
        Intent hoge = new Intent(MainActivity.this, HogeActivity.class);
        hoge.putExtra("line", line);                   
        startActivity(hoge);  
    }
});    

Sujet principal

Dans l'état actuel, le même processus sera exécuté quelle que soit la liste de boutons sur lesquels vous appuyez.

RecyclerView.Adapter a une méthode appelée ʻonBindViewHolder`. C'est la méthode qui sera appelée chaque fois qu'un élément de liste est créé. Et l'argument «position» représente le numéro exact de la liste créée.

** Implémenter pour enregistrer la valeur de cette position dans la variable membre de RecyclerView dans l'écouteur de clic du bouton de la liste. ** ** ** En faisant cela, lorsque le bouton est enfoncé, la valeur du nombre de lignes sera enregistrée dans la variable membre (m_line) de RecycleViewAdapter. ** **

Ensuite, créez une méthode qui peut faire référence à la m_line de l'extérieur, et implémentez-la pour qu'elle soit appelée dans OnClick () de MainActivity. Après cela, c'est OK si vous obtenez la valeur avec HogeActivity de la destination de la transition et modifiez le traitement en conséquence.

RecyclerAdapter.java


public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    // - get element from your dataset at this position
    // - replace the contents of the view with that element
    final int pos = position;
    holder.m_btn.setOnClickListener(new View.OnClickListener() { 
        @Override
        public void onClick(View view) {
            m_line = pos; //Enregistrer le nombre de lignes
            m_listener.onClick(view); //Appelez Main OnClick immédiatement après l'enregistrement
        }
    });
}

public int getLine(){
    return m_line; //Obtenez le nombre de lignes
}

MainActivity.java


final RecyclerView.Adapter rAdapter = new RecycleAdapter(list);
recyclerView.setAdapter(rAdapter);
((RecycleAdapter) rAdapter).setOnItemClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        int line = ((RecycleAdapter) rAdapter).getLine(); //Ici m_Obtenez la valeur de la ligne
        Intent edit = new Intent(MainActivity.this, HogeActivity.class);
        edit.putExtra("line", line);
        startActivity(edit);
    }
});

finalement

C'est une sorte d'implémentation très détournée, Je n'ai pu trouver que cette façon de dire à l'activité principale le nombre de lignes sur lesquelles j'ai appuyé, alors j'ai fini avec cette implémentation. S'il y a quelque chose comme "Non, si vous faites hogehoge sans faire cela, ce sera un coup ...", apprenez-moi.

À la fin

Depuis que j'ai extrait le code de l'application que j'ai créée et que j'ai un peu modifié, les noms de variables dans le texte et le code source peuvent ne pas correspondre. Veuillez le convertir dans le cerveau.

Recommended Posts

Modifier le traitement lorsque le bouton de RecyclerView est enfoncé pour chaque liste
Comment changer le processus en fonction de la liste appuyée lorsqu'il y a plusieurs ListViews
[Android] Contrôlez facilement l'événement lorsque vous appuyez sur le bouton Retour dans Fragment
Redimensionner ou masquer Button et EditText placés à l'écran pour chaque page
Comment effectuer un processus spécifique lorsque le bouton de retour est enfoncé dans le fragment Android
Changez la cible d'injection pour chaque environnement avec Spring Boot 2
[Rails] Lorsque le changement de disposition du dispositif n'est pas reflété
Modifiez la valeur du paramètre pour chaque environnement avec Digdag (RubyOnRails)
Comportement lorsque chacun est exécuté dans la plage inverse
[Android] Modifiez le nom de l'application et l'icône de l'application pour chaque saveur
A quoi sert le constructeur?
Mesures contre l'oubli de spécifier la police lorsque titleTextAttributes est spécifié
Lorsque le traitement après le branchement conditionnel est redondant-12 [C # Refactoring Sample]
[Rails] Comment changer le titre de la page du navigateur pour chaque page
Changez la conversation en fonction du jour d'aujourd'hui