Listview mit checkbox und update der DB

  • Ich bin an meinem ersten kleinen projekt und habe ein Expendable List View mit Checkbox, die Einträge kommen aus der Datenbank. Der checkbox Status soll natürlich auch in der DB abgespeichert werden. Nun meine Frage... Ich habe ein onCheckedChanged und könnte, wenn ich das richtig sehe dort direkt einen DB Aufruf starten und die DB updaten. Macht das Sinn oder würde man einen zusätzlichen Button am Ende der Liste haben und dann erst nach drücken auf den Button die DB updaten?


    Ich vermute, dass man aus Perfomancegründen die zweite Lösung wählt, wobei ich mir momentan noch nicht vorstellen kann wie man das dann durchführt oder ist es doch nur ein schnelles update zwischendurch?

  • ich würde sagen es kommt auf die Daten an...


    Aber die direkte Variante ist sicherlich zu empfehlen, wei: l wenn jetzt jemand mal nicht "den Button" zum speichern drückt, wären alle Veränderungen weg, sicherlich keine gute Usererfahrung. Oder der User verlässt einfach die Activity.


    -> Deine DB ist ja sicherlich eh über einen Datenbankadapter/SQLiteHelper eingebunden und da kannst du Dir sehr leicht/schnell eine Routine schreiben


    -> updateCheckbox(id eintragid, boolean status ) welche nur den Status der der CHeckbox updatet, das hängst du direkt an deinen onChangestatus Listener und alles ist gut

  • Ah, okay, vielen Dank. Ich kenne mich leider nicht so gut aus mit der Android Entwicklung und war halt am Überlegen, ob ein permanentes update Perfomance Probleme bereiten könnte, aber dann werde ich das mal so probieren.


    Hoffentlich bekomme ich es hin. Vielen Dank !!

  • Hi, dürfte ich das Thema mit einer weiteren Frage nochmal herholen?


    Ich habe eine ListView mit selbst erstellten Views. Jeder Eintrag hat ein Bild, ein Text(Name) und eine Checkbox (aus Kontakte).
    Beim klick auf die Checkbox soll -bei checked- der Kontakt in meine eigene DB kopiert werden, -bei unchecked- dann wieder raus genommen werden.


    das hin und her kopieren ist alles kein Problem, ich weiß aber nicht, wo und wie ich die Methode reinschreiben soll. Wie läuft das mit den Listenern, wenn die ListView ganz viele von den selben Views hat?

    Bei Unklarheiten, halten Sie Ihren Kopf kurz in eine Schüssel voll klarem Wasser, dann wirds etwas klarer. Danke ;)


    Gruß Andi ---- Das Huhn oder das Ei zuerst? ;)
    Funtik -- G+

  • Na du schreibst Dir das in deinen OnClickListener vom Listview so würde ich das machen - habe gerade gesehen in dem Beispiel unten bauen sie im Viewholder für jeden Eintrag einen OnClickListener -> das könnte je nach Datenbestand etwas heftig werden..


    Wichtig ist das du bei Listviews mit Checkbox in deiner Listview XML focusable="false" stehen hast, damit die Klicks auch delegiert werden.
    Wenn du Probleme mit dem Klick hast, dann einfach noch mal googlen da gibt es 1000 Lösungen.



    http://www.mysamplecode.com/20…iew-checkbox-example.html


    http://stackoverflow.com/quest…ng-able-to-receive-itemcl




  • vielen Dank für die schnelle Antwort,


    und danke für den Link. Ich werd das mal so ausprobieren, denn ich habe gerade ein weiteres Problem entdeckt.... die Checkboxes in meiner ListView funktionieren sehr seltsam. Wenn ich einige auswähle, dann die Liste scrolle, dann sind plötzlich ganz andere einträge ausgewählt.... schätze ich muss mir da einen eigenen Adapter bauen und die getView methode verändern (...?)

    Bei Unklarheiten, halten Sie Ihren Kopf kurz in eine Schüssel voll klarem Wasser, dann wirds etwas klarer. Danke ;)


    Gruß Andi ---- Das Huhn oder das Ei zuerst? ;)
    Funtik -- G+

  • dann recyclest du den View mit (getView) -> das heisst du musst für jeden Eintrag die EIgenschaften (schriftfarbe, gechecked ect) per Hand setzen ,
    Am besten du benutzt eine View-Holder Pattern, da sollten diese Fehler nicht mehr auftreten.

  • In beiden Antworten wird "Holder Pattern" gesagt.... dann werde ich mir das mal anschaun!


    Danke euch! :)

    Bei Unklarheiten, halten Sie Ihren Kopf kurz in eine Schüssel voll klarem Wasser, dann wirds etwas klarer. Danke ;)


    Gruß Andi ---- Das Huhn oder das Ei zuerst? ;)
    Funtik -- G+

  • Also... bin trotz wenig Zeit schon ein gutes Stück vorwärts gekommen.
    Es hapert allerdings immernoch an den CheckBoxen.


    Wenn ich die Liste Scrolle sind immer wieder andere Boxen ausgewählt. HolderPattern auch schon gemacht. Irgendwas fehlt wohl noch.


    Also beim klicken auf einen Eintrag in der ListView wir die Checkbox auf Checked gesetzt und dann die ID des Kontakts in eine Temporäre Tabelle (SQLite) geschrieben.
    Ich hab versucht in der BindView methode eine Abfrage zu machen, und wenn die ID bereits in meiner Temp. Tabelle ist, dann soll die Checkbox wieder als checked angezeigt werden, ansonsten unchecked. Aber ich kann in der "extends CursorAdapter" Klasse keine getContentResolver() Methode aufrufen. und somit klappt das leider nicht.


    brauche wieder nen Rat :-/


    ConstactList.class


    GetContactsAdapter.class


    Es sollen einfach alle CheckBoxes als checked markiert sein, bei denen die Kontakt ID bereits in meiner Temp Tabelle vorhanden ist.
    Ich saß heute den ganzen Arbeitstag dran und habs nach etlichem hin und her leider noch nicht hinbekommen. Hoffe nun auf einen kleinen Hilfreichen hinweiß... wäre sehr dankbar :)

    Bei Unklarheiten, halten Sie Ihren Kopf kurz in eine Schüssel voll klarem Wasser, dann wirds etwas klarer. Danke ;)


    Gruß Andi ---- Das Huhn oder das Ei zuerst? ;)
    Funtik -- G+

  • Es sind immer genau die Boxen angewählt die auch angewählt sein sollen ;) Dein Problem ist hier das Verständnis von diesen Listen. Debug dein Projekt mal durch und schau dir die ganzen Werte an. Dann wirst du das sehr schnell verstehen wie es läuft.


    Als Tipp:


    http://developer.android.com/g…s/ui/layout/listview.html


    bzw:


    http://www.youtube.com/watch?v=wDBM6wVEO70

  • Du hast schon die richtige Abfrage drin gehabt - die Checkbox muss in jedem Fall gesetzt oder zurückgesetzt werden, da bei längeren Listen die Item-Views recycled werden, und dabei kann die Checkbox durchaus schon mal gesetzt worden sein.


    Nur hast du mit Cursor tC irgendwas vorgehabt, was so nicht geht. Zumindest ist die Variable nicht initialisiert, also null und darum knallt die nachfolgende if-Abfrage.


    Meiner Ansicht nach sollte da was stehen in der Art von if (c.getInt(spaltennummer) == 0) und so weiter. Du willst doch die Count-Information aus dem vorhandenen Cursor ziehen, oder? Die von dir gewünschte Count-Information muss ja für jeden Listeneintrag definiert sein, damit sich in den Listen auch unterschiedliche Werte anzeigen lassen.


    Ansonsten solltest du mal überlegen, was tC sein soll - und es deinem Programm erklären. Irgendwie muss tC ja gefüllt werden, damit du drauf zugreifen kannst.

  • Danke für die Antworten,


    @ drumliner:
    Danke für die Links, aber das habe ich mir natürlich schon angesehen und durchgelesen. Mir ist auch bewusst, dass die Views immer neu gemacht werden beim scrollen, und genau deshalb wollte ich ja in der bindView() Methode eine Abfrage rein machen. nur die Abfrage will er nicht.


    @ UweApps:
    Wie eben erwähnt war das ja genau mein problem. Ich hab dem Cursor tC eine Abfrage gegeben mit getContentResolver().query(...
    Ich hab sie sogar eins zu eins aus meiner anderen Aktivity kopiert, da wo es funktioniert. Aber es funktioniert nicht, weil die Klasse in der ich das mache ist eine Unterklasse von CursorAdapter.. also extends CursorAdapter. Wenn ich statt extends CursorAdapter einfach extends Activity eingeben, dann geht es... aber das ist ja nicht sinn der Sache. Ich will mir ja einen Adapter bauen, und keine Activity :)

    Bei Unklarheiten, halten Sie Ihren Kopf kurz in eine Schüssel voll klarem Wasser, dann wirds etwas klarer. Danke ;)


    Gruß Andi ---- Das Huhn oder das Ei zuerst? ;)
    Funtik -- G+

  • Hallo Funtik,


    die Methode getContentResolver() ist in der Klasse Context definiert - und so einen Context trifft man überlicherweise als Activity im eigenen Code an.


    Über Context läuft vieles, was irgendwie zwischen Anwendung und Umgebung passiert - zum Beispiel Intent-Versenden und Empfangen, Zugriff auf Resourcen, auf das private App-Verzeichnis (u.a. mit Datenbank). Darum wird so häufig ein Context-Objekt an irgendwelche Android-Klassen im Konstruktor übergeben.


    Weil du von was anderem erbst, brauchst du einen Konstruktor im GetContactsAdapter - dem kannst du entweder von der Activity einen ContentResolver mitgeben (ist "hübscher") oder gleich die Activity (ist flexibler) und dann in deinem GetContactsAdapter als privates Attribut vom Typ Context speichern und bei Bedarf nutzen.


    Ich hoffe, das hilft dir weiter. :)

  • Wow bin fasziniert, hab selten so gute Beschreibungen gelesen.
    Das war nun klar ausgedrückt, ich danke dir! :)

    Bei Unklarheiten, halten Sie Ihren Kopf kurz in eine Schüssel voll klarem Wasser, dann wirds etwas klarer. Danke ;)


    Gruß Andi ---- Das Huhn oder das Ei zuerst? ;)
    Funtik -- G+

Jetzt mitmachen!

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