Dynamische Einträge mit HashMap?

  • 20 Antworten
  • Neuester Beitrag
Diskutiere Dynamische Einträge mit HashMap? im Android App Entwicklung im Bereich Betriebssysteme & Apps.
R4M

R4M

Neues Mitglied
Um Inhalte eines ListView zu füllen, bin ich über den Weg von HashMap gestolpert. Hierzu habe ich folgenden Weg gewählt:

Code:
HashMap<String,String> temp = new HashMap<String, String>();
temp.put(COL1, "val1");
temp.put(COL2, "val2");
temp.put(COL3, "val3");
temp.put(COL4, "val4");
temp.put(COL5, "val5 val5 val5 val5 val5 val5 val5 val5 val5 val5");
list.add(temp);
Jetzt ist es allerdings so, dass die Inhalte später aus einem Array dynamisch übergeben werden sollen. Nun dachte ich mir als JS und PHP Programmierer, ich packe das einfach eine for-Schleife um das ganze, aber dann wird bemängelt, dass "temp" schon deklariert ist. Mein Versuch zum Testen sah so aus:

Code:
for ( int i = 0; i < 10; i++ ) {
HashMap<String,String> temp = new HashMap<String, String>();
temp.put(COL1, "val1" + i);
temp.put(COL2, "val2" + i);
temp.put(COL3, "val3" + i);
temp.put(COL4, "val4" + i);
temp.put(COL5, "val5 val5 val5 val5 val5 val5 val5 val5 val5 val5");
list.add(temp);
}
Da hatte ich wohl die falschen Vorstellung. Später soll für die for-Schleife ein Array ausgelesen werden und die Inhalte entsprechend zu COL1 bis COL5 (Felder von ListView) aufgeteilt werden.

Kann mir jemand auf die Sprünge helfen?
 
swa00

swa00

Moderator
Teammitglied
Hallo R4,

was spricht für Dich dagegen, direkt das dynamische Array in einem (Base)Adapter des ListViews
zu verwenden ?
 
Zuletzt bearbeitet:
R4M

R4M

Neues Mitglied
Das muss ich mir erst anschauen um diese Gegenfrage zu beantworten.
 
swa00

swa00

Moderator
Teammitglied
Hallo R4M,

ich habe jetzt deinen Link nur überflogen und ich weis auch nicht , wo der Fehler bei dir Auftritt :
Ohne Log können wir natürlich nicht helfen.
(Würde auch den Rahmen sprengen)

Grundsätzlich musst du dir mal einen Custom(Base) Adapter zu deinem ListView bauen.
Den kannst du dann anpassen , in dem der nicht mehr ein eindimensionales Array handelt , sondern ein Mehrdimensionales

class MyStruct
{
String col;
String value;
}

Dann erstellst du dir einen ArrayList (deine dymnamische) die du füllen kannst
ArrayList <MyStruct> mydynamic;

Diese füllst du dann , übergibst sie dem Adapter und voila , du hast alles drin

Im Adpater unter getView kannst du dann Anzeigen & Reagieren
Beim Klick auf einem Item , kannst die Position ermitteln und die Werte wieder aus deiner ArrayList herausziehen
 
Zuletzt bearbeitet:
R4M

R4M

Neues Mitglied
Klingt alles ganz einfach. Für mich (leider aktuell) etwas viel. Nun ja, da muss ich mich durch "popeln". Danke aber für die schnelle Antwort!
 
swa00

swa00

Moderator
Teammitglied
Ich habe mir deinen Link genauer angesehen ...

Der macht das , was ich beschrieben habe

Nicht haargenau so, aber es gibt ja bekanntlich verschiedene Wege.
Das Grundkonzept stimmt aber
 
R4M

R4M

Neues Mitglied
Ja ja im Prinzip kommt es dem nahe was meiner Vorstellung entspricht. Beim Starten jedoch geht es hier nicht weiter:

MyBaseAdapter.java:
Code:
public ListData getItem(int position) {
        return myList.get(position);
    }
Im Log kommt dann die oben besagte Zeile: error: incompatible types: int cannot be converted to ListData und verweist auf myList.get(position).
Nun ja, jetzt knobbel ich wo der Hund begraben ist.
 
swa00

swa00

Moderator
Teammitglied
Das sagt ja schon alles :
Deine DatenTypen deiner ArrayList sind unterschiedlich
Du vemischst und das gefällt dem Compiler (zurecht) nicht
 
R4M

R4M

Neues Mitglied
Hmmmm, ich sehe den Fehler nicht. Mein Array ist genau das was im oben erwähnten Link zu sehen ist. Mit der Ausnahme, dass ich die Icon raus genommen haben (benötige ich nicht). Es besteht also nur aus Strings. Da muss ich mir erst mal ein Kaffee machen ....
 
R4M

R4M

Neues Mitglied
Hab noch mal versucht alles wieder "jungfräulich" zu machen, aber es scheitert dennoch bei getItem().
object cannot be converted to ListData wobei ArrayList() noch leer ist.

Code:
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import java.util.ArrayList;

public class MyBaseAdapter extends BaseAdapter {

    ArrayList myList = new ArrayList();
    LayoutInflater inflater;
    Context context;
 
    public MyBaseAdapter(Context context, ArrayList myList) {
        this.myList = myList;
        this.context = context;
        inflater = LayoutInflater.from(this.context);
    }
 
    @Override
    public int getCount() {
        return myList.size();
    }

    @Override
    public ListData getItem(int position) {
        return myList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        //
        return convertView;
    }

}
 
swa00

swa00

Moderator
Teammitglied
Hallo ,

das ist auch kein vollständiger Adapter und dein ListData ist im Adapter nirgendwo deklariert
Ein Auto ohne Räder kann erst recht nicht ohne Untergrund fahren (beides fehlt)


Mach dir mal ein neues Projekt und setze das Beispiel dort komplett um - OHNE deine Änderungen.
Und dann, nachdem es läuft , baust du dir das Beispiel auf deine Bedürfnisse um , nicht umgekehrt.

Dann erlernst du auch , wie ein Baseadapter funktioniert
 
R4M

R4M

Neues Mitglied
Ja ich sollte wirklich das jetzige über Bord werfen. Bekomme jetzt zwar keine Fehler mehr, aber dafür werden nun die Inhalte nicht angezeigt - also die Werte vom Array kommen nicht an (leere Zeilen in ListView). Ok, danke dennoch für deine Bemühungen!
 
R4M

R4M

Neues Mitglied
Ich hab mich jetzt 5 Stunden damit befasst. Jetzt ist der Ofen erst mal aus. Hab das Beispiel fast 1:1 übernommen (bis auf das Array) - Fazit nur Fehler. Jetzt lass ich das erst mal - für heute die Schnauze voll :)
 
swa00

swa00

Moderator
Teammitglied
So leid es mir tut, aber Dir fehlen halt die Grundlagen , um so etwas schon umzusetzen ...

Frustrierend , aber wir waren vor einiger Zeit alle mal an dem Punkt ...
 
R4M

R4M

Neues Mitglied
Ha, nach einem Abendbrot-Bier hab ich es endlich hinbekommen. Alles noch mal verworfen und ein Beispiel von github nach gespielt. Jetzt bin ich zufrieden. Schöne Wochenende und Danke für eure Mühe!
 
swa00

swa00

Moderator
Teammitglied
Herzlichen Glückwunsch

Ich bezeichne das aber eher als "Entwickler-Alltagsleben" , also nix besonderes :)
Du wirst dich dran gewöhnen müssen :)

Was denkst du wohl, wie oft wir an einem verzwickten Problem sitzen.
Das kann manchmal Tage dauern
 
markus.tullius

markus.tullius

Experte
Du solltest trotzdem Dich ein bisschen mehr mit den Grundlagen von Java befassen. Wenn man in einer neuen Sprache programmiert, versucht man immer unbewusst Konzepte der alten Sprache zu übernehmen. In PHP hätte das funktioniert. :)
 
swa00

swa00

Moderator
Teammitglied
Stimmt , sonst geht es in der Euphorie unter :

Ich kann mich nur zu 100% den zwei netten "Aufforderungen" von Markus anschliessen :)