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

  • Antworten:76
  • Bentwortet
Frank Rudolf
  • Forum-Beiträge: 215

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
Henrik Martens
  • Forum-Beiträge: 607

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
Frank Rudolf
  • Forum-Beiträge: 215

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
Frank Rudolf
  • Forum-Beiträge: 215

11.02.2016, 11:16:10 via Website

Vermutlich muss ich mich irgendwie auf View beziehen.

Antworten
Henrik Martens
  • Forum-Beiträge: 607

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
Frank Rudolf
  • Forum-Beiträge: 215

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
Frank Rudolf
  • Forum-Beiträge: 215

11.02.2016, 11:23:47 via Website

Auf unser Beispiel bezogen:

ListView(position, Spaltenindex)

wobei position über die globale Variable käme.

Antworten
Henrik Martens
  • Forum-Beiträge: 607

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.
  • Admin
  • Forum-Beiträge: 11.286

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
Frank Rudolf
  • Forum-Beiträge: 215

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.
  • Admin
  • Forum-Beiträge: 11.286

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
Henrik Martens
  • Forum-Beiträge: 607

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.
  • Admin
  • Forum-Beiträge: 11.286

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
Frank Rudolf
  • Forum-Beiträge: 215

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
Henrik Martens
  • Forum-Beiträge: 607

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
Frank Rudolf
  • Forum-Beiträge: 215

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.
  • Admin
  • Forum-Beiträge: 11.286

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
Henrik Martens
  • Forum-Beiträge: 607

11.02.2016, 11:56:53 via Website

Benötigst du die gespeicherte Position denn später, oder direkt nach dem onClick?

Frank Rudolf

Antworten
Frank Rudolf
  • Forum-Beiträge: 215

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
Frank Rudolf
  • Forum-Beiträge: 215

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
Frank Rudolf
  • Forum-Beiträge: 215

11.02.2016, 12:02:49 via Website

Benötigst du die gespeicherte Position denn später, oder direkt nach
dem onClick?

Zwischen dem Speichern und dem WiederVerwenden liegen in der Praxis etwa fünfzehn Sekunden.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

11.02.2016, 12:03:58 via Website

Hä ich verstehe gerade bahnhof...
Du hast doch schon einen long click Listener in der ListView. Den musst du setzen und dann bekommst du ein Event beim langen click und hast die Poisition.
Und dann kannst du dein KontextMenü anzeigen und deine ID einfach eine Ebene tiefer in das Menü enklinken.

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

Frank Rudolf

Antworten
Frank Rudolf
  • Forum-Beiträge: 215

11.02.2016, 12:08:03 via Website

Ich klicke also auf den ListView,

klicke ein paar Mal im Programm herum, um mich an eine andere Stelle zu bewegen und

klicke dann nochmals auf die ListView.

Die ListView fungiert quasi als Navigator.

Das Ganze muss man sich wie einen großen umgekehrten Baum vorstellen. Hierarchisch angeordnete Daten (wenn man es logisch betrachtet).

Oben das Wurzelelement. Dann die dicken Äste (zB Städte, Philosophen, Informatik etc.). Jeder Ast hat wieder Kinder ...

Wie ein binärer Baum, nur eben nicht binär, weil es auch mal sieben oder 29 Kinder haben kann.

Habe noch eine Checkbox, um klar zu machen, ob ich im Baum auf- oder abwärts steigen will.

Antworten
Henrik Martens
  • Forum-Beiträge: 607

11.02.2016, 12:08:35 via Website

Eine Sache frage ich mich noch:

Wann benötigst du die Position des Item wieder, und warum?

Frank Rudolf

Antworten
Frank Rudolf
  • Forum-Beiträge: 215

11.02.2016, 12:09:40 via Website

Wenn ich zB auf eine ListViewZeile klicke, erneuert sich die ListView und ich sehe die Kinder des angeklichten Elements.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

11.02.2016, 12:10:05 via Website

Aber du hast doch im long klick alles was du brauchst oder nicht?

— geändert am 11.02.2016, 12:10:20

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

Frank Rudolf

Antworten
Henrik Martens
  • Forum-Beiträge: 607

11.02.2016, 12:12:09 via Website

Ich verstehe nur Bahnhof :D

Oder benötigst du die ID, um später zu wissen, welchen "Weg" du in dem "Baum" zurück gehen musst?

Frank Rudolf

Antworten
Frank Rudolf
  • Forum-Beiträge: 215

11.02.2016, 12:21:29 via Website

Du hast doch schon einen long click Listener in der ListView.

Ich habe nur einen setonitemclickListener.

Der Listener mit dem long im Namen, den ich von der Seite runter geholt habe, wollte auch glaubich einen Adapter als Argument. Ob das ginge?

Oder benötigst du die ID, um später zu wissen, welchen "Weg" du in dem
"Baum" zurück gehen musst?

Nein, das muss ich mir nicht merken.

Ich muss mir die ID des angeklickten Datensatzes merken, weil ich mich im Programm mit einigen weiteren Klicks an eine andere Stelle bewege.

Zwischendurch wird die ListView ein paar Mal (je nach der neuen Position) aktualisiert.

Ich kann Euch das mit Schaubildern gerne mal verdeutlichen.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

11.02.2016, 12:23:15 via Website

Es geht aber, hab ich auch schon benutzt:

lv.setOnItemLongClickListener(new OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                int pos, long id) {
            // TODO Auto-generated method stub

            Log.v("long clicked","pos: " + pos);

            return true;
        }
    }); 

und dann davor:
lv.setLongClickable(true)

— geändert am 11.02.2016, 12:23:24

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

Frank Rudolf

Antworten
Frank Rudolf
  • Forum-Beiträge: 215

11.02.2016, 12:23:39 via Website

Ich trinke gerade noch einen Kaffee und muss dann mal in ca. 20 Minuten für ca. eine Stunde was erledigen.

Also nicht böse sein, wenn ich mal eine Weile nicht verfügbar sein werde ;).

Antworten
Frank Rudolf
  • Forum-Beiträge: 215

11.02.2016, 12:26:12 via Website

Danke Pascal,

das kann ich vielleicht auch mal ausprobieren.

Du meintest, dass ich

lv.setLongClickable(true)

vor die Log.v-Zeile schreiben muss?

Pascal P.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

11.02.2016, 12:30:10 via Website

Nein vor dem setzen des Listeners, damit der long click akzeptiert wird

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

Frank Rudolf

Antworten
Henrik Martens
  • Forum-Beiträge: 607

11.02.2016, 12:30:20 via Website

Alles gut, wir wollen wir ja helfen :D

Wozu benötisgst du die ID denn "ein paar klicks später"?

Frank Rudolf

Antworten
Frank Rudolf
  • Forum-Beiträge: 215

11.02.2016, 12:41:54 via Website

Wozu benötisgst du die ID denn "ein paar klicks später"?

Wenn ich zB

1001;Wien;3

in

1001;Wien;4

umwandeln möchte,

dann muss ich wissen, welchen Datensatz ich verändern will. Nämlich den Datensatz mit der 1001 als ID.

Antworten
Henrik Martens
  • Forum-Beiträge: 607

11.02.2016, 12:45:07 via Website

warum machst du das denn nicht direkt aus den ClickListener, oder einer Funktion, welche du aus diesem aufrufst?

Frank Rudolf

Antworten
Frank Rudolf
  • Forum-Beiträge: 215

11.02.2016, 12:48:47 via Website

Jetzt willst Du vielleicht wissen, warum ich nicht sofort den Datensatz verändere?

Weil ich erst "sagen" muss, welchen neuen "Vater" dieser Datensatz bekommen soll.

Der bisherige Vater im Beispiel lautet 3. Um sagen zu können, dass es sich nun um die 4 handelt, muss ich zu dem Kontext wechseln, in dem ich alle Kinder der 4 sehe.

Wenn ich zuerst den zu verändernden Datensatz anklicke, befinde ich mich in der Listview, die die Kinder von 3 (Städte) anzeigt. Ich muss also im Programm an die Stelle wechseln, wo die Kinder von 4 stehen. Dann klicke ich auf ein beliebiges Kind und ich kann den Vater dieses Kindes auslesen. Alle Kinder haben an dieser Stelle denselben Vater. Daher ist es egal, welchen Datensatz ich anklicke.

Wie gesagt, ich visualisiere das besser mal. Aber das dauert natürlich ein wenig. Außerdem muss ich gleich weg.

Besten Dank aber schon mal an Euch beide. Ihr helft mir sehr!

— geändert am 11.02.2016, 12:49:36

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

11.02.2016, 12:53:04 via Website

Es genügt wenn du die ID global zwischenspeicherst oder sie in einem Intent an die auflistungs Acgivity mitgibst.
Dann kannst du den "Vater" auswählen und den Datensatz speichern.

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

Frank Rudolf

Antworten
Henrik Martens
  • Forum-Beiträge: 607

11.02.2016, 12:53:20 via Website

Dann würde ich es tatsächlich über einen globale Variable lösen. Gibt mit Sicherheit schönere Lösungen, aber die ist einfach und funktional

Frank Rudolf

Antworten
Frank Rudolf
  • Forum-Beiträge: 215

11.02.2016, 14:22:54 via Website

So, jetzt noch mal wie fast versprochen, eine kleine Erläuterung:

Man stelle sich folgende Datei vor:

0;Infos;0
1;Städte;0
2;D-Städte;1
3;O-Städte;1
4;Hamburg;2
5;Wien;2
6;Salzburg;3

Zu Beginn des Programms werden in der ListView alle Elemente angzeigt, die den Vater 0 haben (Vater-ID = 0):

Wir sehen:

0;Infos;0
1;Städte;0

Dass man auch das Wurzelelement (0;Infos;0) sieht, ist etwas doof. Das werde noch in der Endversion rausnehmen.

Jetzt klicke ich auf 1;Städte;0.

Ich sehe alle Elemente, die den Vater mit der ID 1 haben:

2;D-Städte;1
3;O-Städte;1

Ich klicke auf 2;D-Städte;1 und sehe:

4;Hamburg;2
5;Wien;2

Upps! Das ist doch ein Fehler drin: Wien ist doch keine D-Stadt. Wien ist eine O-Stadt. Wien braucht den Vater 3;O-Städte;1.

Also "klicke" ich lange auf 5;Wien;2, den zu korrigierenden Datensatz. Das Kontextmenü erscheint. Ich wähle Copy und ermittle dabei die ID 5 der falsch zugeordneten Stadt Wien. Mit den SharedPreferences merke ich mir den Wert.

Ich klicke auf irgendeinen der beiden Einträge 4;Hamburg;2 oder Wien, nachdem ich meine Checkbox zum Aufsteigen innerhalb des Baums markiert habe (eben stand sie auf "Abstieg"). Nun steigt die Ansicht eine Ebene höher. Ich sehe wieder den Vater von Hamburg und Wien mit eventuellen Geschwistern. In unserem Falle sehe ich wieder:

2;D-Städte;1
3;O-Städte;1

Nun klicke ich auf 3;O-Städte;1, denn dort hinein gehört Wien. Ich sehe:

6;Salzburg;3

Hier simuliere ich nun wieder einen Doppelklick, indem ich lange auf einen beliebigen Eintrag in der ListView klicke. Zufällig steht nur als einziger Eintrag Salzburg drin. Es öffnet sich das Kontextmenü und ich wähle Insert. Das Programm ermittelt die ID des Vaters (3), holt sich den gemerkten Wert (die ID von Wien: 5) und ändert nun nur den Vater von Wien:

aus 5;Wien;2 wird 5;Wien;3

Damit das Ganze nicht zu unübersichtlich wirkt, sieht der User über der ListView ("Kinder") auch immer den dazugehörigen Vater (siehe bisherige Screenshots).

— geändert am 11.02.2016, 14:26:00

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

11.02.2016, 14:32:05 via Website

Das wäre eine Prima anwendung für eine DB und nicht eine CSV Datei.
Egal, das Problem würde das gleiche sein. So wie du es beschreibst, stelle ich mir das ganze relativ komplex vor.
Wie wäre es einfach mit einem langen click öffnet sich eine neue Activity nennen wir sie mal EditActivity. Dort bekommst du den "Baum" wieder von anfang an gezeigt (ParentId=0) und klickst dich dann durch. Mit dem nächsten langen click auf ein Parent weist du dann deinem "zu bearbitenden Eintrag" eine neue ParentID zu und fertig.
Wenn das ganze jetzt noch mit OOP gemacht ist, sind das 2 Methoden die da aufgerufen werden müssen und erledigt hat sich das ganze.
Zudem kannst du die EditActivity theoretisch auch noch erweitern falls da noch was hinzukommt.

Aber mal weg von meiner Idee zur deiner bisherigen Umsetung:

Gehe sollte es genauso ;)
Und die Theorie dazu passt auch, jetzt frage ich mich, an welchem Punkt der Praxis scheitert es?
Du weisst wie man den onItemLonClickListener benutzt. Du weisst wie man einen Wert in den SharedPrefs speichert und liesßt und die weisst was beim ContextMenü insert passieren soll. Also woran hängt es?

LG

— geändert am 11.02.2016, 14:32:19

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

Frank Rudolf

Antworten
Henrik Martens
  • Forum-Beiträge: 607

11.02.2016, 14:37:57 via Website

Hallo Frank,

jetzt verstehe ich auch, was du hier versuchst.

Ich dem Fall würde ich, um nicht dein komplettes Programm umbauen zu müssen, mit globalen Variablen arbeiten.

Alternativ kannst du auch eine gesonderte Klasse erstellen, welche das kurzfristige speichern und Bereitstellen der Variablen oder Objekte übernimmt

Frank Rudolf

Antworten
Frank Rudolf
  • Forum-Beiträge: 215

11.02.2016, 15:39:28 via Website

Du weisst wie man den onItemLongClickListener benutzt.

Das habe ich noch nicht verifiziert.

Wie gesagt: das Problem steht im Titel: wie kann ich mich auf einen Teil (in diesem Falle die ID) einer angeklickten ListView-Zeile beziehen, wenn ich sie von außerhalb eines setOnItemClickListeners ansprechen will?

Vielleicht haben wir uns auch etwas missverstanden. Im setOnItemClickListener gibt es das Ereignis onItemClick. Vielleicht gibt es dazu auch so etwas wie onItemLongClick.

Ich werde das jetzt erst mal alles gedanklich ordnen, vielleicht auch noch recherchieren und dann sehe ich mal, wie ich das umsetze. Ideen habe ich jetzt ja genug :).

Henrik Martens

Antworten
Frank Rudolf
  • Forum-Beiträge: 215

11.02.2016, 15:42:31 via Website

Alternativ kannst du auch eine gesonderte Klasse erstellen, welche das
kurzfristige speichern und Bereitstellen der Variablen oder Objekte
übernimmt

Ja, ich habe ja sogar schon eine Info-Klasse. Aber da ich noch nicht so vertraut mit OOP bin, hab ich's erst mal anders gemacht. Sauberer wäre es natürlich, wenn man es schön in eine Klasse kapseln würde.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

11.02.2016, 15:43:09 via Website

Nicht nur vielleicht, sondern gibt es. Code beispiel in einem meiner vorherigen Posts.

Vorgehen:
onItemLongClick -> ContextMenü -> wenn edit o.ä. dann nötige IDs speichern.
Dann zum passenden Parent Navigieren longClick -> ContextMenü -> insert -> IDs auslesen ändern speichern und Liste aktuvalisieren

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

Frank RudolfHenrik Martens

Antworten
Frank Rudolf
  • Forum-Beiträge: 215

11.02.2016, 16:36:59 via Website

So, mal ein Zwischenergebnis:

 listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

            public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                                           int pos, long id) {


                Log.v("longClick","arg0.getItemAtPosition(pos) " +  arg0.getItemAtPosition(pos) );
                return true;


            }
        });

Dieser Code liefert im Log:

longClick: arg0.getItemAtPosition(pos) {info=Wittgenstein, id=805,
father=28

Das ist voll korrekt.

Jetzt fragt sich nur noch, wie ich nur auf die 805 , meine gewünschte ID, zugreifen kann.

Aber vor allem:
Jetzt, wo der LongClick geht, wird scheinbar mein Contextmenü unterdrückt und erscheint nicht mehr!?

Nach einem einleitenden

registerForContextMenu(listView);
registerForContextMenu(textViewKopf);

wird das ContextMenü von mir bisher so created:

@Override
    public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        //String text = v.toString() + " " +
        //menu.setHeaderTitle("Context Menu");
        menu.add(0, v.getId(), 0, "Insert");
        menu.add(0, v.getId(), 0, "Copy");
        menu.add(0, v.getId(), 0, "New");
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        if(item.getTitle()=="Copy"){copyInfoId(item.getItemId());}//mit equals: getTitle().equals(“Action 1″)
        else if(item.getTitle()=="Einfügen"){insertInfo(item.getItemId());}
        else if(item.getTitle()=="New"){EnterNewInfo(item.getItemId());}
        else {return false;}
        return true;
    }

Wie kriege ich es hin, dass mein Kontextmenü weiterhin erscheint?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

11.02.2016, 16:40:53 via Website

Das mit dem KontextMenü kann durchaus sein.
Ich benutze da immer alternativen:
1. PopupMenu
2. Alert Dialog with Items

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

Frank Rudolf

Antworten
Frank Rudolf
  • Forum-Beiträge: 215

12.02.2016, 09:47:59 via Website

Wenn ich ein PopupMenu oder einen AlertDialog nähme - was wäre dann mit dem ganzen Fragmentkram, den ich ja bislang im Rahmen meines DialogFragments benutzt habe (inkl. Listener etc.). Entfiehle das alles?

Betrifft ja doch schon einige Teile der Gesamtarchitektur.

Wenn ja, hätte ich mir viel Arbeit sparen können ;).

— geändert am 12.02.2016, 09:48:28

Antworten
Henrik Martens
  • Forum-Beiträge: 607

12.02.2016, 09:52:26 via Website

Berechtigte Frage.

Grundsätzlich würde ich nicht von "Entfallen" sprechen, gegebenenfalls musst du deinen Code natürlich den neuen Gegebenheiten anpassen, ziemlich sicher sogar.

Aber trotzdem benötigst du weiter Listener und auch deine Fragments könne eigentlich stehen bleiben.

Frank Rudolf

Antworten
Frank Rudolf
  • Forum-Beiträge: 215

12.02.2016, 09:56:51 via Website

Schaun wir mal!

Im Augenblick sagt mir das PopUp mehr zu. Mal sehen, wann die ersten Probleme kommen :).

Antworten
Henrik Martens
  • Forum-Beiträge: 607

12.02.2016, 09:59:34 via Website

Das passt, denke ich, auch besser zu dem Zweck. ;)
Jetzt rein vom Optischen her.

Frank Rudolf

Antworten