ListView als Nachrichtenanzeige: Dynamisches hinzufügen von Items aus SQLite

  • Hallo liebes Forum
    Ich verzweifle langsam und bin komplett durcheinander.
    Also hier mein Vorhaben. Ich möchte eine Art Chat/Messaging Anwendung erstellen und bin nun derzeit beim Client. Die Nachrichten sollen ähnlich wie in Telegram/WhatsApp/Standard-SMS in "Bubbles" angezeigt werden. Also Nachricht von mir am rechten Rand, von wem anderes am Linken. Layouts dafür gibt es ja zuhauf, da bin ich auch noch gar nicht so ganz angelangt. Bei mir hapert es derzeit am Code.
    Man sollte dieses Vorhaben mit einer ListView realisieren, richtig?
    Nun ist mein Verständnis vom Grundprinzip des ListView folgendes:

    • Man hat ein ListView Element
    • Dieses Element soll mit Daten befüllt werden zum Anzeigen
    • Um nun die Daten in das ListView Element zu bekommen wird ein Adapter benutzt
    • Der Adapter dient also quasi als Vermittler zwischen ListView und Datan

    Ist das noch soweit richtig?
    Zu meiner Anwendung:
    Die Nachrichten sind in der SQLite Datenbank lokal gespeichert (ist das eigentlich sinnvoll?).
    Beim Start der Activity sollen natürlich erstmal 20 Nachrichten oder so angezeigt werden, damit die Anzeige gefüllt ist. (Das hatte auch schon geklappt mithilfe eines SimpleCursorAdapter.)
    Aber wie realisiere ich es am besten, wenn eine neue Nachricht empfangen oder gesendet wird (Also auch ein neuer Eintrag in der Datenbank entsteht), dass eben diese Nachricht unten an die Liste hinzugefügt wird?
    Ich hab dazu mittlerweile soviele Sachen gelesen, dass ich gar nichts mehr verstehe und Hilfe von aussen brauche.
    Ich wäre also sehr dankbar über Anregungen, Code-Snippets oder weiterführende Infos


    Mit freundlichen Grüßen

  • Ja, das ist soweit noch richtig.


    Es ist auch sinnvoll, Daten lokal in einer SQLite Tabelle abzulegen.


    Sämtliche Änderungen an Deiner ListView werden über den Adapter gemacht.
    Statt des normalen Cursor Adapter solltest Du Dir also eine Subklasse erstellen.
    Diese informierst Du jedes mal, wenn Du eine neue Mitteilung in die Datenbank geschrieben hast.
    Daraufhin informiert die Subklasse Deines Adapters dann Dein ListView, dass sich die Daten geändert haben.
    Dein ListView geht dann den üblichen Weg, um den Adapter nach den Daten zu fragen.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Hi, ich habe zwar noch keinen Chat gemacht, aber wenn es ein Instant Messager wie z.B, whats App werden soll kann ich mir vorstellen, dass ein eigener, SimpleCursorAdapter nicht so geeignet ist.
    Klar ist, dass du eine eigene Adapter Klasse brauchst, die du dann von SimpleCursorAdapter/ArrayAdapter (letzteres würde ich wie gesagt bevorzugen) erben lässt.
    Dazu dann eine DataModelNachricht Klasse schreiben, also eine Klasse, die als Attribute alles hat, was eine Nachricht eben so ausmacht (die Absender ID, den Namen des Absenders, den Inhalt der Nachricht selber etc. ).
    In deiner Activity, die den Chat anzeigt legst du dann eine ArrayList<DataModelNachricht> an, die du dem Überschriebenen Konstruktor bei der erstellung des Adapters mitgibst, so, dass dir die ArrayList in dem Adapter zur verfügung steht. In der onCreate() der Activity kannst du vorher noch die Liste mit den in der SQLite Datenbank gespeicherten Nachrichten befüllen, damit sie direkt am Anfang dargestellt werden.
    In dem Adapter gibt es dann eine getView(int postition, ...) Methode (weiß nicht wie weit du schon in die Materie vorgedrungen bist), die jedesmal aufgerufen wird, wenn ein Listeneintrag darfgestellt werden soll. Hier kannst du dann eine if Anweisung machen, in etwa so(Pseudocode)

    Code
    if(ListeMitNachrichten.get(position)== eigeneID){
     // Sprechblase von inks darstellen} else { //Sprechblase von rechts darstellen }


    In der Methode, in der du die Nachrichten vom Server bekommst und in ein Objekt der DataModelNachricht steckst musst du dann noch adapter.setNotifyDataChange() oder so ähnlich aufrufen, damit die Liste sich aktualisiert und die neuen Nachrichten in die SQLite Datenbank schreiben.
    Ich hoffe das ist halbwegs verständlich, das mit den Adaptern ist anfangs immer ein wenig irritierend.
    Aber wie gesagt, ich habe noch nie einen Messanger gemacht, also keine Garantie.


    mfg

  • Ich hatte leider in den letzten Tagen wenig Zeit und werde in den nächsten Tagen wohl auch wenig Zeit haben... Ich habe aber ein wenig weitergewerkelt und mir ist auch klar geworden, dass nen CursorAdapter nicht ganz das wahre ist. In Ansätzen hatte ich auch schon so gedacht wie du Binbose, aber ich glaube wenn ich konkret dran arbeite, werde ich nochmal Hilfe brauchen,wahrscheinlich auch hin und wieder kleine Codeausschnitte. Ich melde mich wenn ich wieder Zeit habe.
    MfG

Jetzt mitmachen!

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