[JAVA] [Android] Ich möchte den Listener über die Schaltfläche in ListView abrufen

Einführung

Wenn Sie eine Android-App entwickeln, werden Sie sich auf jeden Fall treffen "Die Hölle einer ListView, die einen benutzerdefinierten Adapter beißt"

Es wäre nicht möglich, wenn es einmal implementiert wäre. Dieses Mal möchte ich noch weiter gehen und einen Button in die ListView einfügen.

Überraschenderweise gibt es viele solche Szenen, oder? CheckBox, Schaltfläche bearbeiten oder löschen.

Dieses Mal möchte ich mein Bestes geben, um die Benutzeroberfläche unten zu erstellen. Es ist ein Ersatz für ein persönliches Memo.

click.gif

Machen Sie vorerst einen Anrufer

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] + "Die Schaltfläche Bearbeiten wurde gedrückt", Toast.LENGTH_SHORT).show();
            break;
          case R.id.delete:
            Toast.makeText(MainActivity.this, countries[position] + "Die Löschtaste wurde gedrückt", 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>

Dieses Mal ist nur ListView für MainActivity vorbereitet. Die ListView wird von dem unten eingeführten benutzerdefinierten Adapter gebissen, und eine benutzerdefinierte ListView, die den Text mit zwei Schaltflächen anzeigt, wird konfiguriert.

Die Einschränkung besteht darin, der ListView einen "SetOnItemClickListener" zu geben, um das Klickereignis von der Adapterseite abzurufen. Vergiss nicht ...

Um festzustellen, um welche Schaltfläche es sich bei dem erfassten Ereignis handelt, wird es implementiert, indem die ID in der switch-Anweisung angegeben wird.

Bereiten Sie einen benutzerdefinierten Adapter vor

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="Bearbeiten"/>

  <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="Löschen"/>

</RelativeLayout>

Im benutzerdefinierten Adapter wird der Teil, der in jeder Zeile angezeigt werden soll, von "findById" erfasst, der Text ist der Ländername von "setText ()", die Schaltfläche deckt "SetOnClickListener" mit "performeItemClick" ab und das Ereignis wird an die übergeordnete ListView gesendet. Diese Methode wird am meisten empfohlen, da sie relativ einfach ist und keinen anderen Code beeinträchtigt.

Am Ende

Was haben Sie gedacht? Es gibt verschiedene Möglichkeiten, die Ereignisse in der ListView abzurufen, aber die, die ich dieses Mal eingeführt habe, ist die einfachste, und ich denke, sie ist einfach einzuführen, da Sie den ursprünglichen Code nicht so stark ändern müssen. Außerdem ist der Ablauf nicht so kompliziert, daher war er meiner Meinung nach leicht zu verstehen.

Ich hoffe, es wird für alle hilfreich sein.

Recommended Posts

[Android] Ich möchte den Listener über die Schaltfläche in ListView abrufen
Ich möchte den Wert in Ruby erhalten
[Java] Ich möchte die Differenz zum Datum berechnen
Ich möchte eine TraceId in das Protokoll einbetten
Tokoro habe ich in der Migration von Wicket 7 auf 8 umgeschrieben
Ich möchte die Protokollausgabe unter Android vereinfachen
[Android Studio] Ich möchte Einschränkungen für die in EditText [Java] registrierten Werte festlegen.
# 1_JAVA Ich möchte die Indexnummer durch Angabe eines Zeichens in der Zeichenfolge erhalten
Ich möchte die if-else-Anweisung für bedingte Verzweigungen in Java vereinfachen
Ich möchte den Inhalt von Assets in der mit capistrano erstellten Umgebung von Grund auf neu erstellen
Ich möchte einige Eigenschaften als JSON-Strings in Jackson erhalten!
[Android / Java] Verstehen Sie den Beschreibungstyp in den Listener-Einstellungen (Schaltflächeninstallation).
Ich möchte den oberen Rand in der UITableView von Grouped entfernen (schnell)
[Java] Ich möchte mit dem Schlüssel im Objekt eindeutig arbeiten
Ich möchte den Wert von Attribute in Selenium of Ruby ändern
Ich möchte @Autowired in Servlet verwenden
[Ruby] Ich möchte nur das ungerade Zeichen in der Zeichenfolge ausgeben
Ich möchte JSP in Emacs einfacher als die Standardeinstellung schreiben.
[Hinweis] Ich möchte mit afterLast mit JdbcTemplate in umgekehrter Reihenfolge arbeiten
So erhalten Sie den Einstellungswert (Eigenschaftswert) aus der Datenbank in Spring Framework
Ich möchte bei der Registrierung in der Datenbank eine Fehlermeldung anzeigen
Ich möchte den Feldnamen des [Java] -Felds erhalten. (Alter Ton)
R von Java ausführen Ich möchte rJava ausführen
[Rails] Ich habe versucht, die Version von Rails von 5.0 auf 5.2 zu erhöhen
Ich möchte eine E-Mail in Java senden.
Ich habe versucht, die Sitzung in Rails zu organisieren
3 Möglichkeiten zum Importieren von Bibliotheken in Android Studio
Ich möchte den Inhalt der Absicht var_dump
So erhalten Sie eine Klasse von Element in Java
Ich möchte APP_HOME an Logback in Gradle übergeben
rsync4j - Ich möchte rsync in Java berühren.
Ich möchte mit Firestore von Rails spielen
Ich möchte irgendwann sogar in Kotlin sein
Ich möchte schnell von Java nach SQLite schreiben
Ich möchte nach dem Dezimalpunkt abschneiden
Holen Sie sich Ihre Versionsnummer in der Android-App
Ich möchte den Wert von Cell unabhängig vom CellType (Apache POI) transparent erhalten.
Ich möchte rekursiv die Oberklasse und die Schnittstelle einer bestimmten Klasse erhalten
Ich möchte eine Liste nur eindeutiger Zeichenfolgen erhalten, indem feste Zeichenfolgen vom Dateinamen ausgeschlossen werden
Ich möchte ausgeben, welches Zeichen eine beliebige Zeichenfolge von links erscheint
Ich war süchtig nach NoSuchMethodError in Cloud-Endpunkten
Ich möchte Combine auch in UIKit verwenden.
Ich möchte die praktischen Funktionen von Clojure in Kotlin nutzen
Ich möchte so etwas wie "cls" in Java machen
Ich möchte auch in Laradock Fischschalen verwenden! !!
Ich möchte ES2015 auch in Java verwenden! → (´ ・ ω ・ `)
Ich möchte den Pfad nach der neuen Registrierung ändern, nachdem ich mich mit mehreren Geräten angemeldet habe.
Ich möchte das in der Datenbank gespeicherte Protokoll morphologisch analysieren und in der Datenbank speichern, um Nachrichten 1 zu klassifizieren
Ich möchte den Bereich anhand des monatlichen Abschlusses beurteilen
Ich möchte ein kleines Symbol in Rails verwenden