Auf Teil einer angeklickten Zeile einer ListView von außerhalb des setOnItemClickListeners zugreifen?

  • Antworten:76
  • OffenNicht stickyBentwortet
  • Forum-Beiträge: 213

11.02.2016, 10:59:46 via Website

Ich habe eine ListView:

image

Wenn ich lange auf einen Eintrag dieser ListView (zB Münster) drücke, erscheint ein Kontextmenü, in dem sich der Eintrag Copy befindet. Ich möchte dann die ID (für Münster zB 402) kurzfristig speichern. Das mache ich mit SharedPreferences.

Alles kein Problem, aber:
Wie gelange ich an die ID?

Etwas Ähnliches mache ich ja auch im ClickListener der ListView:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                String father = ((TextView) view.findViewById(R.id.textViewId)).getText().toString();
...

Die ID steht im TextView namens textViewId.
Nehme ich aber die letzte Zeile und schreibe sie irgendwoanders hin, so erscheint view in rot.

Wichtig dürfte unter anderem sein, dass ich mich auch beim Zugriff auf zB die zweite Zeile der ListView auf die angeklickte Position beziehe. Falls die Position nullbasiert ist, dürfte Münster zB den Index oder die Position 1 haben.

Wie kann ich mich also auf die ID der jeweils angeklickten ListView-Zeile von außerhalb der ClickListeners beziehen?

Hintergrund:
Ich benötige die ID, um einen Datensatz einem anderen "Vater" zuzuweisen. Die ID des Vaters sieht man im Bild ganz rechts. Der Name des Vaters heißt "Städte". Allgemeiner ausgedrückt: eine Information wird auf logischer Ebene einer anderen Information zu- (oder vielleicht besser untergeordnet). Das Ganze mache ich am besten über das Kontextmenü.

Mir kommt gerade eine Idee: Gibt es vielleicht so etwas wie einen setOnItem*Double*ClickListener :), der ja mein Kontextmenü einleiten würde?

— geändert am 11.02.2016, 11:10:37

Antworten
  • Forum-Beiträge: 605

11.02.2016, 11:04:56 via Website

Du willst außerhalb des Listeners wissen, welches Item angeklickt wird?
Dann muss du aus dem Listener eine globale Variable verändern, das sollte gehen.

Aber außerhalb des Listeners ist ja nicht mal bekannt, wann ein Click geschieht.

Oder verstehe ich dich jetzt falsch?

Frank Rudolf

Antworten
  • Forum-Beiträge: 213

11.02.2016, 11:14:27 via Website

Hallo Henrik!

Ich glaube schon, dass Du mich richtig verstanden hast.

Hast Du auch die letzte Zeile meines Beitrags gelesen, die ich relativ spät angefügt habe?

In der Tat: von außerhalb weiß das System nicht, was angeklickt wurde.

Ich habe echt keinen Plan, wie ich das mit der globalen Variable machen muss. Vielleicht erläuterst Du das noch ein wenig?

Antworten
  • Forum-Beiträge: 605

11.02.2016, 11:17:11 via Website

Wenn du im onClickEreignis abfängst, welches Item angeklickt wurde, kannst du die Int des Items in eine Variable speichern, welche global verfügbar ist. Am besten deklarierst du diese direkt am Anfang deiner Class, nicht in einer Funktion.

Frank Rudolf

Antworten
  • Forum-Beiträge: 213

11.02.2016, 11:21:53 via Website

Wenn du im onClickEreignis abfängst, welches Item angeklickt wurde,
kannst du die Int des Items in eine Variable speichern, welche global
verfügbar ist. Am besten deklarierst du diese direkt am Anfang deiner
Class, nicht in einer Funktion.

Verstehe. Ich könnte mir position "rausholen" (auf die globale Ebene).

Gibt es dann auch einen Befehl, wie ich mich auf die bestimmte Position innhalb der ListView beziehe? position liefert dann ja wohl die Zeile. Dann bräuchte ich noch die Spalte (als Namen oder Index?).

Mir schwebt so was wie ListView(Zeilenindex, Spaltenindex) vor.

Antworten
  • Forum-Beiträge: 213

11.02.2016, 11:23:47 via Website

Auf unser Beispiel bezogen:

ListView(position, Spaltenindex)

wobei position über die globale Variable käme.

Antworten
  • Forum-Beiträge: 605

11.02.2016, 11:24:55 via Website

Ich denke du wirst die Position als einzelne Zahl bekommen.

Erste Zeile, zweite Spalte wäre dann 2
Zweite Zweile, dritte Spalte wäre dann 6
usw.

Zu 100% kann ich es aber nicht sagen.

Frank Rudolf

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.170

11.02.2016, 11:26:16 via Website

Gehen tut das schon aber was ist der Zweck des ganzen?
Lässt es sich nicht einfacher lösen?

LG Pascal //It's not a bug, it's a feature. :) ;)

Frank Rudolf

Antworten
  • Forum-Beiträge: 213

11.02.2016, 11:30:04 via Website

ich habe hier was gefunden:

setOnItemLongClickListener(AdapterView.OnItemLongClickListener listener)
Register a callback to be invoked when an item in this AdapterView has been clicked and held

Ob das hiermit gehen könnte (ohne die globale Variable etc.)?

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.170

11.02.2016, 11:32:42 via Website

Ja, long click registreirt einen langen click auf das ListViewItem.
Dann kannst du dein ContextMenü anzeigen lassen

LG Pascal //It's not a bug, it's a feature. :) ;)

Frank Rudolf

Antworten
  • Forum-Beiträge: 605

11.02.2016, 11:41:10 via Website

Richtig, aber ist somit sein Problem gelöst, dass er außerhalb des Listeners die Position benötigt?

Ich glaube ich verstehe gar nicht, wozu er das benötigt :D

Frank Rudolf

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.170

11.02.2016, 11:46:50 via Website

Deswegen sage ich ja erklären warum, dann ist es einfacher eine Lösung zu finden ;)

LG Pascal //It's not a bug, it's a feature. :) ;)

Frank Rudolf

Antworten
  • Forum-Beiträge: 213

11.02.2016, 11:49:29 via Website

Das Kontextmenü funktioniert (habe das zB mit dem NeuHinzufügen gestern noch hingekriegt). Das Kontextmenü ist aber nicht das Problem.

Henrik, wozu ich das brauche, hatte ich eigentlich im EingangsBeitrag geschrieben. Ich sags gerne noch mal:

Ich möchte in meiner Textdatei eine Zeile verändern. Aus

1001;Wien;3

soll zB

1001;Wien;4

werden.

Also muss ich mir diesen Datensatz in der ListView "greifen". Sowas macht man ja üblicherweis übers Kontextmenü. Zum Ändern muss ich mir dann noch die ID merken.

Ich werde dann später an anderer Stelle einen Datensatz anklicken und dem Programm sagen, welcher neuen ID (Vater; im Beispiel die 4) Wien zugeordnet werden soll.

Ich hoffe, Du erahnst nun, was das Ganze soll :).

— geändert am 11.02.2016, 11:51:30

Antworten
  • Forum-Beiträge: 605

11.02.2016, 11:51:22 via Website

So ungefähr :D Hoffe ich

Dann würde ich aus dem onClickListener eine Funktion aufrufen, die sich darum kümmert die Bearbeitung der Datei zu vorzunehmen. Dieser kannst du ja beliebig viele Variablen übergeben.

Frank Rudolf

Antworten
  • Forum-Beiträge: 213

11.02.2016, 11:55:02 via Website

Das Ganze hat was von Copy & Paste :).

Und so denke ich, dass man im Internet Beispiele in Verbindung mit einer LIstView finden müßte.

Aber ihr seid manchmal so gut, dass ich in diesem Falle erst mal Euch fragen wollte.

Die Idee von Henrik mit der Globalen ist ja auch nicht so schlecht.

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.170

11.02.2016, 11:56:30 via Website

Nicht schlecht schon, aber weniger praktikabel, wenn man einen longClickListener schon hat ;)

LG Pascal //It's not a bug, it's a feature. :) ;)

Frank Rudolf

Antworten
  • Forum-Beiträge: 213

11.02.2016, 11:58:51 via Website

Dann würde ich aus dem onClickListener eine Funktion aufrufen, die
sich darum kümmert die Bearbeitung der Datei zu vorzunehmen. Dieser
kannst du ja beliebig viele Variablen übergeben.

Das Bearbeiten der Datei ist kein Problem. Das habe ich ja zB etwas anders beim Neuhinzfügen von Datensätzen schon gemacht.

Das Problem ist nur der Zugriff auf die ID der angeklickten Zeile. Das ginge vielleicht mit Deiner Idee, Henrik.

Wenn es zB einen Listener für einen LongClick (wegen Kontextmenü) oder sowas gäbe, würde das wohl schon genügen. Ich muss vielleicht einfach mal noch ein wenig googeln :).

— geändert am 11.02.2016, 11:59:36

Antworten
  • Forum-Beiträge: 213

11.02.2016, 12:01:29 via Website

Nicht schlecht schon, aber weniger praktikabel, wenn man einen
longClickListener schon hat ;)

Ich bin mir nicht sicher, ob das mit dem Ding geht, das ich hier weiter oben gezeigt hatte. Das Beispiel kam von dieser gewissen Android-Seite.

Antworten

Empfohlene Artikel