Custom ListView getView() - radio button onclicklistener

  • Hallo Leute,


    ich versuche mich seit einiger Zeit an der Android Programmierung und habe jetzt ein Problem, bei dem ich nicht weiter weiß. Ich versuche eine Applikation zu erstellen, bei der ich sozusagen die Teilnahme von Spielern meines Sportvereins dokumentiere.


    Ich habe eine Datenbank, in der alle Spielernamen als einzelne Tabelle gespeichert sind. Durch ein Custom listView Adapter habe ich als ListView Item eine View, die aus einem Bild, einem Name und 3 Radio Buttons besteht (RB: Anwesend, Entschuldigt, Unentschuldigt).


    Nun habe ich mir gedacht, lege eine globale ArrayList an, die den Status aus der DB ausließt bzw dann auch schreibt. Der Status ist ein Integer der jeweils für einen selektierten Radio Button steht. Nun passen auf meinem Bildschirm 7 Einträge rauf. Wenn ich einen Eintrag bearbeite, d.h. ein RadioButton selektiere und runterscrolle, wird "das Muster" vom 1.-7. Eintrag auf die 8.-14. übernommen, da ja alles neu geladen wird.


    Jetzt ist nur mein Problem, ich hab gar kein Plan, wie ich diese Sache behebe und sitze schon so lange dran, dass ich wahrscheinlich den Wald vor lauter Bäumen nicht sehe. Könntet ihr mal drüber schauen und mir Tipps geben, wie ich dieses neu laden verhindern kann bzw. die richtigen Werte anzeige?


    Wichtige Variablen:
    ArrayList<String> spielernamen; //spielernamen = tabellenname für SQL Tabelle
    ArrayList<Integer> statusGesamt; //Speichert global den Status, Reihenfolge analog zu spielernamen


    In dieser Datei wird die ListView angezeigt:



    Das ist mein Adapter:


    Das ist das Objekt:



    Wenn Ihr mir helfen könntet, wäre ich euch sehr sehr dankbar! :)


    Beste Grüße
    Marcel

  • Hatte mal ein ähnliches Problem...


    Wieso speicherst du mit dem OnClickListener der jeweiligen RadioCheckBox nicht gleich den Status in deine Datenbank? Dann könntest du innerhalb deines Adapters beim Aufbau der ListView die jeweiligen Daten bzgl. Status direkt aus deiner Datenbank ziehen wenn du den entsprechenden Eintrag aufbaust. Du müsstest dann nur beim Ausführen des OnClickListeners die Liste nochmals refreshen damit sie auch den jeweils aktuellsten Stand anzeigt.


    Falls du Zeit hast würde ich mir evtl. auch überlegen einen BaseAdapter anstelle des ArrayAdapters zu verwenden.


    http://www.pcsalt.com/android/…sing-baseadapter-android/


    Ich hatte auch ein paar grafische Probleme bei ListViews wie Views die wiederholt angezeigt wurden. Mit der Verwendung eines BaseAdapters konnte ich viele Probleme beseitigen. Kann dir jetzt ehrlich gesagt so spontan nicht sagen wieso der BaseAdapter diese Probleme gelöst hat oder ob es nur Zufall war. Eventuell lohnt es sich ja für dich dir das ganze mal anzuschauen.

  • Hallo,


    dein erster Vorschlag war mein Plan A. Ich habe ein OnClickListener für jeden Button erstellt, und nachdem welchen man betätigt wurde für den geklickten Spieler ein Eintrag in die Datenbank vorgenommen.


    Nur hatte ich dann das Problem mit der Wiederholung der Werte, dass heißt wenn ich beim 1. ein Button selektiert habe, wurde der 8. und 15. auch markiert. Daher hatte ich dann die Variante mit den globalen DatenArray gewählt, der beschrieben wird. Eigentlich wollte ich das auch irgendwie in die getView einbauen, ist mir wohl aber gar nicht gelungen.


    Ich bin leider auch noch nicht so Experte in den ganzen Android Programmiergeschichten...ich werde den BaseAdapter mal ausprobieren, vielleicht geht es dann besser. Ich hab viel im Netz gefunden, dass diese Items sich mitverändern, wenn sie nicht zu sehen sind, aber richtige Lösungen hatte da auch keiner.


    Ich probiere jetzt den BaseAdapter und melde mich dann noch einmal.


    Beste Grüße

  • Ja ich glaube das mit den Wiederholungen könnte daran liegen das der ArrayAdapter nicht weiss welche View innerhalb deiner ListView bereits gebildet wurde.


    Ich meinte mich zu erinnern das die Holder des BaseAdapters dieses Problem lösen. Ich glaube das entscheidende passiert in diesem Teil des Baseadapters.

    Java
    if (convertView == null) {
                convertView = inflater.inflate(R.layout.layout_list_item, parent, false);
                mViewHolder = new MyViewHolder(convertView);
                convertView.setTag(mViewHolder);
            } else {
                mViewHolder = (MyViewHolder) convertView.getTag();
            }
    }


    Vielleicht würde es sich auch lohnen eine DatabaseHandler Klasse zu implementieren mit der du auf deine Datenbank zugreifst. Vor allem wenn deine App noch an Umfang zunehmen soll und du noch andere Dinge mit deinen Daten anstellen möchtest. Ein solcher Database Handler würde dann quasi alle wichtigen Methoden zur Manipulation(Hinzufügen, Löschen, Sortieren, Filtern etc..) beinhalten. Die einzelnen Methoden geben dir dann einen Cursor als Rückgabewert mit dem du Zugriff zu deiner Datenbank bekommst. Mit dem jeweiligen Cursor gehst du dann quasi durch deine Tabellen durch und pickst dir die gewünschten Werte heraus. Die gleichen Cursor kannst du dann auch im BaseAdapter für den Zugriff auf die Daten bzw. den Aufbau der Liste verwenden. Falls dich das interessiert solltest du im Netz genügend Beispiele und Anleitungen finden wenn du nach SQLite und Databasehandler suchst.


    z.b. hier http://www.androidhive.info/20…sqlite-database-tutorial/

  • Hi,


    in der Zeile 18 - 26 habe ich ja einen DataHandler integriert...



    Code
    // UI Objekte aus layout_spielerlistview
        public static class DataHandler{
            public ImageView bild;
            public TextView name;
            public RadioButton UE;
            public RadioButton E;
            public RadioButton A;
        }

    ich setze mich heute noch mal ran und probiere deine Vorschläge aus. Danke für deine Hilfe!

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!