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

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

12.02.2016, 10:06:11 via Website

Eine Frage hätte ich da aber noch.

Öffnet sich das Popup auch automatisch bei einem längeren Drücken auf ein ListViewElement?

Antworten
Henrik Martens
  • Forum-Beiträge: 607

12.02.2016, 10:09:41 via Website

Ich denke nicht.

Du musst im "onLongClickListener" schon angeben, was passieren soll.

Frank Rudolf

Antworten
Frank Rudolf
  • Forum-Beiträge: 215

12.02.2016, 10:36:45 via Website

Ich versuche das Popup-Beispiel von Pascal umzusetzen.

Hierbei tauchen die ersten Fehler auf:

PopupMenu popup = new PopupMenu(MainActivity.this,listView);

Unreachable Statement heißt es.

Das erste Argument ist der Kontext, das zweite der Anker (wohl das Element, das das Anzeigen des Popups bewirken soll).

Bis zur Eingabe von listView war noch nichts rot unterstrichen.

Antworten
Frank Rudolf
  • Forum-Beiträge: 215

12.02.2016, 10:42:56 via Website

 final ListView listView = (ListView) findViewById(R.id.view_item);

habe ich übrigens in onCreate geschrieben.

view_item ist die einzelne Zeile innerhalb der ListView.

Antworten
Henrik Martens
  • Forum-Beiträge: 607

12.02.2016, 10:43:55 via Website

Unreachable Statement ist immer ein Statemant, also ein Befehl, von dem der Compiler der Meinung ist, dass es (egal was auch passiert) nie ausgeführt werden kann, weil es nicht zu erreichen ist.

Frank Rudolf

Antworten
Frank Rudolf
  • Forum-Beiträge: 215

12.02.2016, 10:57:36 via Website

Kommando zurück:

ich habe das Zeug nach dem return geschrieben. Das konnte ja nicht gut gehen.

— geändert am 12.02.2016, 10:57:53

Antworten
Henrik Martens
  • Forum-Beiträge: 607

12.02.2016, 10:59:38 via Website

Exakt :D Daher kam der Fehler ;)

Gleiches Problem bekommst du auch, wenn du eine if-Abfrage hast, und da die returns rein schreibst.
Dann sollte man immer,zur Sicherheit, ganz am Ende noch ein "return null" setzen, sonst kann es sein, dass der Compiler nie ein return erreicht.

Frank Rudolf

Antworten
Frank Rudolf
  • Forum-Beiträge: 215

12.02.2016, 11:10:08 via Website

OK, es geht jetzt. Jedenfalls die Anzeige mit dem kleinen BeispielToast.

Eher nebensächliche Frage:
Das Popup wird so eher links oben positioniert. Kann man das nicht zentrieren oder woanders hin setzen?

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

12.02.2016, 11:12:25 via Website

Du bindest das bisher an die ListView und nicht an das ListItem.
Dadurch wird das da oben angezeigt.

Binde es an an anderes View, dann ists besser, bsp. an die gecklickte View die du im clickEvent übergeben bekommst.

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

Antworten
Henrik Martens
  • Forum-Beiträge: 607

12.02.2016, 11:13:46 via Website

Das sollte gehen, wenn du in der XML des PopUps, unter

<menu xmlns:androclass="http://schemas.android.com/apk/res/android">

zu

<menu xmlns:androclass="http://schemas.android.com/apk/res/android>
             android:layout_gravity="center_vertical|center_horizontal>

änderst.

EDIT: Pascals Lösung ist die "sauberere".

— geändert am 12.02.2016, 11:14:36

Pascal P.

Antworten
Frank Rudolf
  • Forum-Beiträge: 215

12.02.2016, 11:23:09 via Website

Ich hatte noch einen Denkfehler.

Eigentlich brauche ich mein DialogFragment ja noch. Das Popup ist ja nur eine Zwischenstation.

Der erste Test läuft gerade.

Antworten
Henrik Martens
  • Forum-Beiträge: 607

12.02.2016, 11:31:02 via Website

Das freut mich zu hören :)

Frank Rudolf

Antworten
Frank Rudolf
  • Forum-Beiträge: 215

12.02.2016, 11:40:00 via Website

Also, den Toast zeigt er immer noch richtig an.

Ich teste auf den New-Zweig des Popups und versuche auf meine alten Methoden zuzugreifen, die bereits funktionierten.

Aber es tut sich nichts.

Hier mal zur Übersicht der Code des "Long-Teils":

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));
                String father = ((TextView) arg1.findViewById(R.id.textViewId)).getText().toString();
                mId = father;

                Log.d("double click", father);

                PopupMenu popup = new PopupMenu(MainActivity.this,listView);
                popup.getMenuInflater().inflate(R.menu.popup_menu, popup.getMenu());

                //registering popup with OnMenuItemClickListener
                popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    public boolean onMenuItemClick(MenuItem item) {
                        Toast.makeText(MainActivity.this, "You Clicked : " + item.getTitle(), Toast.LENGTH_SHORT).show();

                        if(item.getTitle()=="Copy Info"){copyInfoId(item.getItemId());}//mit equals: getTitle().equals(“Action 1″)
                        else if(item.getTitle()=="Insert Info"){insertInfo(item.getItemId());}
                        else if(item.getTitle()=="New"){EnterNewInfo(item.getItemId());}

                        return true;
                    }
                });

                popup.show();

                return true;

            }

        });

Antworten
Frank Rudolf
  • Forum-Beiträge: 215

12.02.2016, 11:41:07 via Website

Mit den returns komme ich noch nicht so klar. Das könnten potentielle Fehlerquellen sein.

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

12.02.2016, 11:43:49 via Website

Kommt wenigstens der erste "Toast"?

Und Über den Strig würde ich das nicht vergleichen, schon garncith mit ==.
String Vergleioche bitte immer mit String#equals(otherString)
Und beim menü bietet es sich an über die ItemID zu gehen.
Also swich/cahse über die ID und fertig.
Damit sparst du dir das If getue

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

Frank Rudolf

Antworten
Henrik Martens
  • Forum-Beiträge: 607

12.02.2016, 11:44:25 via Website

Bedenken musst du einfach nur, dass returns immer, und sofort bei Erreichen, die Aktion abbrechen.

Frank Rudolf

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

12.02.2016, 11:46:10 via Website

Aber so wie das oben im Code mit returns ist, passt das ;)

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

Frank Rudolf

Antworten
Frank Rudolf
  • Forum-Beiträge: 215

12.02.2016, 11:47:27 via Website

Hallo Pascal,

ja, der erste Test-Toast geht korrekt.

Bedenken musst du einfach nur, dass returns immer, und sofort bei
Erreichen, die Aktion abbrechen.

Du meinst wahrscheinlich, dass alle Befehle nach einem Return ignoriert werden?

Antworten
Henrik Martens
  • Forum-Beiträge: 607

12.02.2016, 11:48:15 via Website

Sicher ? Wie gesagt ich hab mich da jetzt nicht reingelesen, aber wenn das vorletzte return erreicht werden würde, dann würde pupup.show(); nie aufgerufen werden.

— geändert am 12.02.2016, 11:48:35

Frank Rudolf

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

12.02.2016, 11:49:17 via Website

Da das erste Toast kommt liegt es an den Ifs.
Wie gesagt strings NIE mit == prüfen.
Nimm lieber die ID und machen nen switch/case drum

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

Henrik Martens

Antworten
Frank Rudolf
  • Forum-Beiträge: 215

12.02.2016, 12:07:43 via Website

So, die aktuelle Version. Es tut sich noch nichts. Der Toast kommt aber wie gehabt.

Bin jetzt für ein, zwei Stunden weg.

 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));
                String father = ((TextView) arg1.findViewById(R.id.textViewId)).getText().toString();
                mId = father;

                Log.d("double click", father);

                PopupMenu popup = new PopupMenu(MainActivity.this,listView);
                popup.getMenuInflater().inflate(R.menu.popup_menu, popup.getMenu());

                //registering popup with OnMenuItemClickListener
                popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    public boolean onMenuItemClick(MenuItem item) {
                        Toast.makeText(MainActivity.this, "You Clicked : " + item.getTitle(), Toast.LENGTH_SHORT).show();

                        switch(item.getItemId()){
                            case 0:
                                EnterNewInfo(item.getItemId());
                                break;
                            case 1:
                                copyInfoId(item.getItemId());
                                break;
                            case 2:
                                insertInfo(item.getItemId());
                                break;

                        }
                        return true;
                    }
                });

                popup.show();

                return true;

            }




        });

Antworten
Frank Rudolf
  • Forum-Beiträge: 215

12.02.2016, 12:09:21 via Website

Ich versuche das nachher mal genauer mit dem Debugger zu untersuchen etc.

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

12.02.2016, 12:10:07 via Website

Sind auch noch Fehler drinne ;)

Du musst ja den case mit den R.id konstanten machen und dann die IDs nehmen, welche du in der XML hinterlegt hast
z.B.
in der xml steht

android:id="@+id\item1"

dann machst du 
case R.id.item1: 
//deinCode
break;

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

Frank Rudolf

Antworten
Henrik Martens
  • Forum-Beiträge: 607

12.02.2016, 12:11:07 via Website

Dann dürfte es eigentlich funktionieren.

Frank Rudolf

Antworten
Frank Rudolf
  • Forum-Beiträge: 215

12.02.2016, 13:27:14 via Website

Es geht:D!

Auch mit anschließender Anwahl von New, dem Hinzufügen eines neuen Datensatzes und anschließendem Aktualisieren der ListView.

Ich glaube, ich habe auch einiges gelernt.

Besten Dank an Euch beide!

Vorerst setze ich das Thema auf "erledigt".

— geändert am 12.02.2016, 13:29:34

Pascal P.

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

12.02.2016, 13:29:33 via Website

Sehr schön :)

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

Frank Rudolf

Antworten
Henrik Martens
  • Forum-Beiträge: 607

12.02.2016, 13:30:35 via Website

Hey super :)

Frank Rudolf

Antworten