[ANDROID STUDIO] Element im GridView aktualisieren

  • Antworten:6
Samsong
  • Forum-Beiträge: 18

03.09.2020, 11:27:54 via Website

Hey Leute,

da ich mich kurz halten möchte. Hier eine kurze Zusammenfassung:

Die erste Activity hat einen NumberPicker und die gewählte Nummer wird an die nächste Activity weitergegeben. Dort habe ich eine GridView und beim ersten Durchlauf erzeugt der Code eine ArrayList mit Elementen "PlayerX" (X = eine Zahl von 1 bis zum Wert aus dem NumberPicker)

Alles funktioniert gut, aber ich kann die Werte nicht aktualisieren.

Wenn der Benutzer auf einen Namen klickt (z.B. "Player2"), öffnet sich ein AlertDialog mit dem Namen im Titel und einem EditText. Nach dem Bestätigen des neuen Namens mit dem Positiv-Button wird der neue Name gespeichert, aber nicht in der Grid-Ansicht angezeigt. Wenn ich erneut auf den gleichen Namen ("Player2") klicke, wird der neue Name jedoch im Titel des AlertBuilders angezeigt. Später in der App, steht aber wieder Player2 und nicht der neu eingegebene Name.

Der gesamte Code läuft im CustomAdapter. Hier der Code:

convertView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {

        //um tastatur automatisch zu öffnen und schließen
        final InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);

        //andere Listview

        LayoutInflater linf = LayoutInflater.from(getContext());
        final View inflator = linf.inflate(R.layout.builder_window, null);
        AlertDialog.Builder alert = new AlertDialog.Builder(getContext());

        alert.setTitle(birdList.get(position));
        alert.setView(inflator);

        final EditText et1 = (EditText) inflator.findViewById(R.id.edit_name);

        alert.setPositiveButton("Continue", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton)
            {
                String s1=et1.getText().toString();
                adapter.remove(birdList.get(position));
                adapter.insert(s1, position);
                adapter.notifyDataSetChanged();                        
            }
        });

        alert.setNegativeButton("Delete", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int whichButton) {
                        adapter.remove(birdList.get(position));
                        adapter.notifyDataSetChanged();
                    }
                });

        alert.setNeutralButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {
                dialog.cancel();
            }
        });

        alert.show();
    }

Das funktioniert aber relativ problemlos beim Löschen. Dort wird die Liste nach dem Drücken des "Delete"Knopfes aktualisiert und löscht einen Wert (aber den letzten und nicht den ausgewählten)

Bitte, könnt ihr mir helfen? Ich mache jetzt an dem blöden Problem schon etliche Stunden rum und komme einfach auf kein Ergebnis...

Danke im Voraus

Kommentieren
swa00
  • Forum-Beiträge: 3.704

03.09.2020, 11:32:10 via Website

Bei solchen Fällen habe ich eine übergeordnete ArrayList ( nicht die im Adapter), lösche den Item
dort, setze diese ArrayList neu an den Adpater und mache dann erst ein notifyChange

— geändert am 03.09.2020, 11:32:35

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
SamsongPascal P.
Kommentieren
Samsong
  • Forum-Beiträge: 18

03.09.2020, 13:34:57 via Website

Hey, danke für Deine schnelle Antwort!

Leider bin ich noch nicht so der Experte. Das was Du sagst, hört sich aber gut an! Wollte das gerade probieren, aber jetzt steh ich vor dem "Problem", dass ich zwar die Liste an den Adapter übergeben kann (Mit Hilfe von dem Konstruktor), aber ich kann die Liste nicht wieder an die Activity zurück leiten.

Wollte es ganz normal über

MainActivity test = new MainActivity(); 
test.setList(birdList); 

übergeben, aber das funktioniert ja nicht.
Sorry, bin kein so Experte. Bin ich komplett auf dem Holzweg? Kannst Du mir vielleicht sagen, wie man das am Besten macht?

Hilfreich?
Kommentieren
swa00
  • Forum-Beiträge: 3.704

03.09.2020, 14:05:21 via Website

aber ich kann die Liste nicht wieder an die Activity zurück leiten.

Warum zurückleiten ?
Erstelle dein Array da , wo du den Adapter innitiierst. (wahrscheinlich in deiner Main)

Dort nimmst du alle Änderungen vor und übergibst die bereinigte Liste wieder an den Adapter

— geändert am 03.09.2020, 14:16:11

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Samsong
Kommentieren
Samsong
  • Forum-Beiträge: 18

03.09.2020, 14:55:11 via Website

Verdammt. Hatte das vorher leider falsch implementiert. Da hat es nicht funktioniert mit dem AlertBuilder.

Habe es jetzt in die Main gepackt und dort werden die Daten dann geändert oder gelöscht, aber es passiert wieder dasselbe wie in der CustomAdapter.class.

Also: Kann den Namen ändern (dieses Mal wird direkt die ArrayList in der Main bearbeitet, wie von dir empfohlen), aber es ändert sich wieder nur der Wert im AlertBuilder und nicht in der GridView. Wo muss ich denn den notifyDataSetChanged ausführen? Also wann in der CustomAdapter.class?

Und es wird nachwievor nicht der Wert gelöscht, den ich möchte, sondern einfach der Letzte. Also es wird schon der Wert gelöscht, aber es rückt dann einfach alles um eine Position auf, so dass bspw Player4 nach dem löschen immer noch da ist, aber Player10 (der letzte in der Liste) gelöscht wird.

Sorry für die dummen Fragen

Nachtrag:
Wenn ich bspw Player4 lösche, dann wird im Gridview zwar Player10 rausgeschmissen, aber wenn ich auf Player9 (der nach dem Löschen dann auf der letzten Position ist) drücke, steht dran, dass es Player10 ist.
Es wird also Player4 gelöscht, nur übernimmt mein GridView dieses Update nicht

— geändert am 03.09.2020, 14:59:36

Hilfreich?
Kommentieren
Samsong
  • Forum-Beiträge: 18

04.09.2020, 10:15:54 via Website

Also habe es geschafft.
Habe jetzt einfach folgende Zeilen in die onClick Methode gepackt:

myAdapter = new CustomAdapter(PlayerNames.this, R.layout.grid_view_items, myList);
myAdapter.notifyDataSetChanged();
simpleList.invalidateViews();
simpleList.setAdapter(myAdapter);

Danke für die Hilfe @swa00

Hilfreich?
Kommentieren
swa00
  • Forum-Beiträge: 3.704

04.09.2020, 10:18:53 via Website

Sieht gut aus :-)

Danke für die Hilfe @swa00

Immer wieder gerne , dafür ist das Forum da :-)

— geändert am 04.09.2020, 10:19:39

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Pascal P.Samsong
Kommentieren