Ich habe eine, ListView
wo jedes Element in der Liste eine Textansicht und zwei verschiedene Schaltflächen enthält. Etwas wie das:
ListView
--------------------
[Text]
[Button 1][Button 2]
--------------------
[Text]
[Button 1][Button 2]
--------------------
... (and so on) ...
Mit diesem Code kann ich eine OnItemClickListener
für den gesamten Artikel erstellen :
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> list, View view, int position, long id) {
Log.i(TAG, "onListItemClick: " + position);
}
}
});
Ich möchte jedoch nicht, dass das gesamte Element anklickbar ist, sondern nur die beiden Schaltflächen jedes Listenelements.
Meine Frage ist also, wie ich einen onClickListener für diese beiden Schaltflächen mit den folgenden Parametern implementiere:
int button
(Auf welche Schaltfläche des Elements wurde geklickt)int position
(Dies ist das Element in der Liste, auf das das Klicken auf die Schaltfläche erfolgt ist.)
Update: Ich habe eine Lösung gefunden, wie in meiner Antwort unten beschrieben. Jetzt kann ich über den Touchscreen auf die Schaltfläche klicken / tippen. Ich kann es jedoch nicht manuell mit dem Trackball auswählen. Es wählt immer das gesamte Listenelement aus und geht von dort direkt zum nächsten Listenelement, wobei die Schaltflächen ignoriert werden, obwohl ich .setFocusable(true)
und setClickable(true)
für die Schaltflächen in festgelegt habe getView()
.
Ich habe diesen Code auch meinem benutzerdefinierten Listenadapter hinzugefügt:
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public boolean isEnabled(int position) {
return false;
}
Dies führt dazu, dass überhaupt kein Listenelement mehr auswählbar ist. Es hat jedoch nicht geholfen, die verschachtelten Schaltflächen auswählbar zu machen.
Hat jemand eine Idee?
Antworten:
Die Lösung dafür ist tatsächlich einfacher als ich dachte. Sie können einfach in der
getView()
Methode Ihres benutzerdefinierten Adapters einen setOnClickListener () für die von Ihnen verwendeten Schaltflächen hinzufügen .Alle Daten mit der Taste zugeordnet sind , mit hinzugefügt werden
myButton.setTag()
in demgetView()
und in den OnClickListener zugegriffen werden überview.getTag()
Ich habe eine detaillierte Lösung in meinem Blog als Tutorial veröffentlicht.
quelle
Dies ist eine Art Antwort von anhang @ znq ...
Es gibt viele Fälle, in denen Sie die Zeilenposition für ein angeklicktes Element wissen möchten UND wissen möchten, auf welche Ansicht in der Zeile getippt wurde. Dies wird in Tablet-Benutzeroberflächen viel wichtiger sein.
Sie können dies mit dem folgenden benutzerdefinierten Adapter tun:
quelle
Für zukünftige Leser:
Um die Tasten mit dem Trackball manuell auszuwählen, verwenden Sie:
Und um den Fokus auf die gesamten Listenelemente zu deaktivieren:
Es funktioniert gut für mich, ich kann auf Schaltflächen mit Touchscreen klicken und auch einen Klick über die Tastatur fokussieren
quelle
Ich habe nicht viel Erfahrung als die oben genannten Benutzer, aber ich hatte das gleiche Problem und habe es mit der folgenden Lösung gelöst
btnRemoveClick Click-Ereignis
quelle
Wahrscheinlich haben Sie gefunden, wie es geht, aber Sie können anrufen
und jetzt werden Ihre Tasten fokussiert
quelle
Ich bin mir nicht sicher, ob ich der beste Weg sein soll, aber es funktioniert einwandfrei und der gesamte Code bleibt in Ihrem ArrayAdapter.
quelle
Ich weiß, dass es spät ist, aber dies kann helfen. Dies ist ein Beispiel dafür, wie ich eine benutzerdefinierte Adapterklasse für verschiedene Klickaktionen schreibe
quelle
Ist die Plattformlösung für diese Implementierung nicht die Verwendung eines Kontextmenüs, das bei langem Drücken angezeigt wird?
Ist dem Autor der Frage Kontextmenüs bekannt? Das Stapeln von Schaltflächen in einer Listenansicht hat Auswirkungen auf die Leistung, führt zu Unordnung in Ihrer Benutzeroberfläche und verletzt das empfohlene UI-Design für die Plattform.
Auf der Kehrseite; Kontextmenüs - von Natur aus ohne passive Darstellung - sind für den Endbenutzer nicht offensichtlich. Erwägen Sie, das Verhalten zu dokumentieren?
Dieser Leitfaden sollte Ihnen einen guten Start geben.
http://www.mikeplate.com/2010/01/21/show-a-context-menu-for-long-clicks-in-an-android-listview/
quelle