ListView-Items einer HashMap<String, String> übergeben

  • Hallo zusammen,


    ich bin neu hier im Forum und hätte auch gleich mal eine Frage zu einem Problem.


    Ich versuche zur Zeit einen MP3-Player für Android umzusetzen. Funktioniert soweit alles ganz gut.
    Doch momentan ist es so, dass der Benutzer nur eine Songliste hat und von dieser Liste einen Song zum Abspielen auswählen kann. Natürlich wird dann immer automatisch der nächste Song abgespielt.


    Nun möchte ich aber folgendes umsetzen:
    Es soll eine Songliste geben, von der man einen, mehrere oder alle Songs auswählen kann (per CheckBox) und diese dann einer Playliste hinzufügt.


    Ich habe eine Klasse namens MP3Finder geschrieben, die alle Songs, die sich auf der SD-Karte befinden, ermittelt und in einer ArrayList mit einer HashMap&lt;String, String&gt; speichert. In der MP3Finder-Klasse habe ich eine Methode defniert &gt;&gt;getMP3List()&lt;&lt;, die diese ArrayList&lt;HashMap&lt;String, String&gt;&gt; zurückgibt.


    In meiner SongListActivity habe ich ein ListView das die ganzen Songs aus diesem ListArray&lt;HashMap&lt;&gt;&gt; mittels CheckedTextView-Items auflistet.
    Nun will ich wie bereits weiter oben erwähnt, dass alle ausgewählten Songs (gesetztes Häkchen) in einer neuen ArrayList&lt;HashMap... gespeichert werden, die ich dann mittels einem Intent der PlayListActivity übergeben möchte.


    Doch leider habe ich absolut keine Ahnung, wie ich die ListView-Items der HashMap übergeben soll. Das übergeben bzw. speichern der HashMap-Daten in die ListView habe ich ja mittels einem Adapter umgesetzt. Aber wie macht man das umgekehrt?


    Google spuckt nur Beispiele aus, wie man Daten aus einer HashMap in einer ListView speichert. Umgekehrt habe ich leider keine Beispiele finden können. Daher hoffe ich, dass Ihr mir dabei helfen könnt. :)


    Ich hoffe ihr habt in etwa verstanden, was ich gerne umsetzen möchte. Ich hoffe ihr könnt mir dabei helfen. Ich würde mich jedenfalls sehr freuen.


    Grüße DaveX78

  • Du bekommst ja die Position in der Liste und die ID. Damit solltest du auf deine Liste zugreifen können und die dann separat speichern.

    MfG,
    Christopher


    Eine gewisses Maß an Freundlichkeit kann man auch von Menschen im Internet erwarten.
    Das Forum basiert komplett auf der Freiwilligkeit ihrer Nutzer und diese sollen sich wohlfühlen! Daher seid bitte freundlich. Danke

  • Hallo Christopher,


    erstmals danke für die Antwort. Die Position oder die ID ist nicht das Problem. Sondern eher das Vorgehen. Ich weiß nicht wie man mein Vorhaben für gewöhnlich umsetzt.
    Zum testen habe ich mal folgendes gemacht:


    Die Ausgabe ist folgende (wenn beispielsweise ein Item ausgewählt ist):

    Code
    {mp3Path=/storage/emulated/0/artist - song.mp3, mp3Title=artist - song}

    Also müsste ich diesen String splitten und dann in einer Hashmap&lt;String, String&gt; den Teil mp3Path=/.. (was auch den Schlüssel darstellt) im ersten &lt;String, ...&gt; und den Teil mp3Title=... im zweiten &lt;..., String&gt; speichern, richtig?


    Gibt es auch eine elegantere Vorgehensweise?


    Edit:
    Mit eleganter meine ich z.B. die Tatsache, dass man den Inhalt einer ArrayList&lt;HashMap&lt;String, String&gt;&gt; mittels einem Adapter in eine ListView übertragen kann. Aber umgekehrt wäre zumindest mir nicht bekannt, dass es auch so elegant geht. Deshalb meine beiden Fragen.

  • Das beste ist folgendes:
    Baue eine Klasse zusammen, die dann alle Daten hält. Dann hast du eine Liste von Objekten und kannst dann anschließend über die ID einfach nur das Objekt übernehmen. Dafür brauchst du dann aber auch einen neuen Adapter, der deine Klasse verarbeitet. Dort kann man dann auch Sachen, wie ein eigenes Layout einbauen.
    Das ging evtl. nicht so aus dem vorherigen Post hervor. Entschuldige bitte :)


    Ansonsten da du ja Multichoice nimmst, kannst du auch den OnClickListener weglassen und evtl. in der toolbar einen Menüpunkt (normalerweise ein Haken) anlegen und dann alle auslesen. Dann ist das evtl noch ein bisschen effizienter ;)

    MfG,
    Christopher


    Eine gewisses Maß an Freundlichkeit kann man auch von Menschen im Internet erwarten.
    Das Forum basiert komplett auf der Freiwilligkeit ihrer Nutzer und diese sollen sich wohlfühlen! Daher seid bitte freundlich. Danke

  • Der OnClickListener für den Button namens "isChecked" hatte ich sowieso nur zum testen eingebaut. :)
    Ansonsten werde ich mir deinen Vorschlag, eine Klasse die alle Daten enthält, auf jeden Fall durch den Kopf gehen lassen.
    Ich hatte mir für mein konkretes Beispiel folgendes ausgedacht:

    Ist meiner Meinung nach nicht so schön, sollte aber funktionieren. Leider ist mir aber nun ein anderes Problem aufgefallen. :(
    Habe ich jetzt eben erst bemerkt. Entweder verzettelt sich irgendwie die get()-Methode des SparseBooleanArray-Objekts "checked", oder irgendwas geht schief bei den listView-Methoden getAdapter().getItem(...).
    Denn lasse ich mir testweise bei jedem Durchlauf der Schleife den String item mittels System.out.println() ausgeben, werden die falschen Songs angezeigt. Nur die die eben nicht ausgwählt sind, werden richtig angezeigt, nämlich mit "unchecked" - oder wenn alle ausgewählt sind, dann werden auch alle richtig ausgegeben. Finde ich irgendwie seltsam und komme auch nicht drauf wieso das so ist. Denn eigentlich passt ja alles.

  • Grundsätzlich ist das ja eine Lösung, nur halt keine Schöne :D
    Was meinst du denn mit falschen Ausgaben?

    MfG,
    Christopher


    Eine gewisses Maß an Freundlichkeit kann man auch von Menschen im Internet erwarten.
    Das Forum basiert komplett auf der Freiwilligkeit ihrer Nutzer und diese sollen sich wohlfühlen! Daher seid bitte freundlich. Danke

  • Hier mal der Quellcode:



    Momentan habe ich zum testen 8 Titel als .mp3 auf der SDKarte. Um hier keine Werbung zu machen, die Titel sind folgendermaßen gespeichert:

    Code
    {mp3Path=/storage/emulated/0/artist - song1.mp3, mp3Title=artist - song1}
    {mp3Path=/storage/emulated/0/artist - song2.mp3, mp3Title=artist - song2}
    {mp3Path=/storage/emulated/0/artist - song3.mp3, mp3Title=artist - song3}
    {mp3Path=/storage/emulated/0/artist - song4.mp3, mp3Title=artist - song4}
    {mp3Path=/storage/emulated/0/artist - song5.mp3, mp3Title=artist - song5}
    {mp3Path=/storage/emulated/0/artist - song6.mp3, mp3Title=artist - song6}
    {mp3Path=/storage/emulated/0/artist - song7.mp3, mp3Title=artist - song7}
    {mp3Path=/storage/emulated/0/artist - song8.mp3, mp3Title=artist - song8}

    Habe ich beispielsweise Song1, Song3, Song7 und Song8 ausgewählt, gibt mir println() folgendes aus:



    Code
    System.out: {mp3Path=/storage/emulated/0/artist - song1.mp3, mp3Title=artist - song1} &lt;-richtig
    System.out: Unchecked &lt;- richtig
    System.out: {mp3Path=/storage/emulated/0/artist - song7.mp3, mp3Title=artist - song7} &lt;-falsch
    System.out: Unchecked &lt;- richtig
    System.out: Unchecked &lt;- richtig
    System.out: Unchecked &lt;- richtig
    System.out: {mp3Path=/storage/emulated/0/artist - song1.mp3, mp3Title=artist - song1} &lt;-falsch
    System.out: {mp3Path=/storage/emulated/0/artist - song1.mp3, mp3Title=artist - song1} &lt;-falsch

    UPDATE:
    Okay - ich konnte das Problem beheben. :)


    Ich habe diese Code-Zeile:

    Java
    String item = listView.getAdapter().getItem(checked.keyAt(i)).toString();

    durch die folgende ersetzt:

    Java
    String item = listView.getItemAtPosition(i).toString();

    Nun werden die ausgewählten Songs 100% richtig angezeigt. ;)

Jetzt mitmachen!

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