[JAVA] [Android] Je souhaite obtenir l'auditeur à partir du bouton de ListView

introduction

Si vous développez une application Android, vous rencontrerez certainement "L'enfer d'un ListView mordant un adaptateur personnalisé"

Cela ne serait pas possible une fois mis en œuvre. Cette fois, j'aimerais aller plus loin et mettre un Button dans le ListView.

N'y a-t-il pas beaucoup de situations comme celle-ci? CheckBox, modifier ou supprimer le bouton.

Cette fois, j'aimerais faire de mon mieux pour créer l'interface utilisateur ci-dessous. C'est un substitut à un mémo personnel.

click.gif

Faire un appelant pour le moment

MainActivity.java


public class MainActivity extends AppCompatActivity {
  private static final String[] countries = {
    "America",
    "Japan",
    "China",
    "Korea",
    "British",
    "German"
  };

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ListView listView = (ListView) findViewById(R.id.listView);
    CustomAdapter adapter = new CustomAdapter(getApplicationContext(), R.layout.row_item, countries);
    listView.setAdapter(adapter);
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
      @Override
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        switch (view.getId()) {
          case R.id.edit:
            Toast.makeText(MainActivity.this, countries[position] + "Le bouton Modifier a été enfoncé", Toast.LENGTH_SHORT).show();
            break;
          case R.id.delete:
            Toast.makeText(MainActivity.this, countries[position] + "Le bouton de suppression a été enfoncé", Toast.LENGTH_SHORT).show();
            break;
          }
       }
    });
  }
}

main_activity.xml


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              tools:context="hiroto.myapplication.MainActivity">

  <ListView
    android:id="@+id/listView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:divider="@color/gray"
    android:dividerHeight="1dp"/>

</LinearLayout>

Cette fois, seul ListView est préparé pour MainActivity. Nous configurons un ListView personnalisé qui affiche le texte avec deux boutons en mordant le ListView avec l'adaptateur personnalisé présenté ci-dessous.

La mise en garde ici est de donner à ListView un SetOnItemClickListener pour obtenir l'événement de clic du côté de l'adaptateur. N'oubliez pas ...

Pour déterminer le bouton de l'événement acquis, il est implémenté en spécifiant l'id dans l'instruction switch.

Préparez un adaptateur personnalisé

CustomAdapter.java


class CustomAdapter extends BaseAdapter {
  private LayoutInflater inflater;
  private int resourcedId;
  private String[] items;

  static class ViewHolder {
    Button editButton;
    TextView textView;
    Button deleteButton;
  }

  CustomAdapter(Context context, int resourcedId, String[] items) {
    this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    this.resourcedId = resourcedId;
    this.items = items;
  }

  @Override
  public View getView(final int position, View convertView, final ViewGroup parent) {
    ViewHolder holder;
    if (convertView == null) {
      convertView = inflater.inflate(resourcedId, parent, false);

      holder = new ViewHolder();
      holder.editButton = convertView.findViewById(R.id.edit);
      holder.textView = convertView.findViewById(R.id.text);
      holder.deleteButton = convertView.findViewById(R.id.delete);
      convertView.setTag(holder);
   } else {
      holder = (ViewHolder) convertView.getTag();
   }

    holder.textView.setText(items[position]);

    holder.editButton.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
        ((ListView) parent).performItemClick(view, position, R.id.edit);
      }
    });
    holder.deleteButton.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
        ((ListView) parent).performItemClick(view, position, R.id.delete);
      }
    });

    return convertView;
  }

  @Override
  public int getCount() {
    return items.length;
  }

  @Override
  public Object getItem(int position) {
    return position;
  }

  @Override
  public long getItemId(int position) {
    return position;
  }
}

row_item.xml


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal">

  <Button
    android:id="@+id/edit"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentStart="true"
    android:text="Éditer"/>

  <TextView
    android:id="@+id/text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerVertical="true"
    android:layout_marginStart="30dp"
    android:layout_toEndOf="@+id/edit"/>

  <Button
    android:id="@+id/delete"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentEnd="true"
    android:text="Effacer"/>

</RelativeLayout>

Dans l'adaptateur personnalisé, la partie à afficher dans chaque ligne est acquise par findById, le texte est le nom du pays par setText (), le bouton couvre SetOnClickListener avec performeItemClick, et l'événement est envoyé au ListView parent. Cette méthode est la plus recommandée car elle est relativement simple et n'interfère pas avec d'autres codes.

À la fin

Qu'as-tu pensé? Il existe différentes façons d'obtenir les événements dans ListView, mais celui que j'ai présenté cette fois est le plus simple, et je pense qu'il est facile à introduire car vous n'avez pas à modifier autant le code d'origine. De plus, le flux n'est pas si compliqué, donc je pense que c'était facile à comprendre.

J'espère que cela sera utile à tout le monde.

Recommended Posts

[Android] Je souhaite obtenir l'auditeur à partir du bouton de ListView
Je veux obtenir la valeur en Ruby
[Java] Je souhaite calculer la différence par rapport à la date
Je veux intégrer n'importe quel TraceId dans le journal
Tokoro j'ai réécrit dans la migration de Wicket 7 à 8
Je souhaite simplifier la sortie du journal sur Android
[Android Studio] Je souhaite définir des restrictions sur les valeurs enregistrées dans EditText [Java]
# 1_JAVA Je veux obtenir le numéro d'index en spécifiant un caractère dans la chaîne de caractères
Je souhaite simplifier l'instruction if-else de la branche conditionnelle en Java
Je veux recréer le contenu des actifs à partir de zéro dans l'environnement construit avec capistrano
Je veux obtenir des propriétés sous forme de chaînes JSON dans Jackson!
[Android / Java] Comprendre le type de description dans les paramètres d'écoute (installation du bouton)
Je veux supprimer la marge supérieure dans UITableView de Grouped (swift)
[Java] Je veux effectuer distinctement avec la clé dans l'objet
Je veux changer la valeur de l'attribut dans Selenium of Ruby
Je veux utiliser @Autowired dans Servlet
[Ruby] Je souhaite afficher uniquement le caractère impair dans la chaîne de caractères
Je veux écrire une JSP dans Emacs plus facilement que la valeur par défaut.
[Note] Je veux obtenir dans l'ordre inverse en utilisant afterLast avec JdbcTemplate
Comment obtenir la valeur du paramètre (valeur de la propriété) à partir de la base de données dans Spring Framework
Je souhaite afficher un message d'erreur lors de l'inscription dans la base de données
Je veux obtenir le nom de champ du champ [Java]. (Vieux ton d'histoire)
Exécuter R à partir de Java Je veux exécuter rJava
[Rails] J'ai essayé de faire passer la version de Rails de 5.0 à 5.2
Je souhaite envoyer un e-mail en Java.
J'ai essayé d'organiser la session en Rails
3 façons d'importer des bibliothèques dans Android Studio
Je veux var_dump le contenu de l'intention
Comment obtenir une classe depuis Element en Java
Je souhaite transmettre APP_HOME pour me connecter à Gradle
rsync4j --Je veux toucher rsync en Java.
Je veux jouer avec Firestore de Rails
Je veux être finalement même à kotlin
Je veux écrire rapidement de java vers sqlite
Je veux tronquer après la virgule décimale
Obtenez votre numéro de version dans l'application Android
Je veux obtenir la valeur de Cell de manière transparente quel que soit CellType (Apache POI)
Je veux obtenir récursivement la superclasse et l'interface d'une certaine classe
Je souhaite obtenir une liste de chaînes de caractères uniques uniquement en excluant les chaînes de caractères fixes du nom de fichier
Je veux afficher quel caractère une chaîne de caractères arbitraire apparaît à partir de la gauche
J'étais accro à NoSuchMethodError dans Cloud Endpoints
Je souhaite également utiliser Combine dans UIKit.
Je souhaite utiliser les fonctions pratiques de Clojure dans Kotlin
Je veux faire quelque chose comme "cls" en Java
Je veux aussi utiliser des coquillages à Laradock! !!
Je veux aussi utiliser ES2015 avec Java! → (´ ・ ω ・ `)
Je souhaite modifier le chemin après une nouvelle inscription après m'être connecté avec plusieurs appareils.
Je souhaite analyser morphologiquement le journal stocké dans la base de données et le stocker dans la base de données pour classer les messages 1
Je veux juger la gamme en utilisant le diplôme mensuel
Je veux utiliser une petite icône dans Rails