ListView Item individuell einfärben

jerevat

Mitglied
Guten Abend,

ich arbeite hier mit Android Studio (Android 12) und möchte einer ListView zur Laufzeit Einträge (Hex-Farbwerte) hinzufügen und zu jeden Eintrag soll der Hintergrund in der jeweiligen Farbe erscheinen.
Aktuell stürzt die App an dieser Stelle ab, weil das entsprechende Child-Element (View) nach der Adapter-Aktualisierung zur Laufzeit null ist/wird:

Code:
public class MainActivity extends AppCompatActivity {

    ArrayList<String> _colorList = new ArrayList<>();
    ArrayAdapter<String> _listViewAdapter;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        _listViewAdapter = new ArrayAdapter<>(getApplicationContext(), android.R.layout.simple_list_item_1, _colorList);

    }
    
    public void onButtonClick(View view) {

        _colorList.add("#FF0000");
        _listView.setAdapter(_listViewAdapter);
        _listView.getChildAt(0).setBackgroundColor(Color.parseColor(_colorList.get(0)));  // _listView.getChildAt(0) ist null und App stürzt ab

    }
}

Wenn aber vorher (im onCreate) das String-Array (colorList) befüllt ist und zur Laufzeit nur das setBackgroundColor aufgerufen wird, funktioniert das Einfärben, nur habe ich nichts davon, denn ich möchte zur Laufzeit die ListView mit neuen Einträgen füllen und färben.
Wisst ihr, wie das richtig geht?
 
Guten Abend,

ich arbeite hier mit Android Studio (Android 12) und möchte einer ListView zur Laufzeit Einträge (Hex-Farbwerte) hinzufügen und zu jeden Eintrag soll der Hintergrund in der jeweiligen Farbe erscheinen.
Aktuell stürzt die App an dieser Stelle ab, weil das entsprechende Child-Element (View) nach der Adapter-Aktualisierung zur Laufzeit null ist/wird:

Code:
public class MainActivity extends AppCompatActivity {

    ArrayList<String> _colorList = new ArrayList<>();
    ArrayAdapter<String> _listViewAdapter;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       
        _listViewAdapter = new ArrayAdapter<>(getApplicationContext(), android.R.layout.simple_list_item_1, _colorList);

    }
   
    public void onButtonClick(View view) {

        _colorList.add("#FF0000");
        _listView.setAdapter(_listViewAdapter);
        _listView.getChildAt(0).setBackgroundColor(Color.parseColor(_colorList.get(0)));  // _listView.getChildAt(0) ist null und App stürzt ab

    }
}

Wenn aber vorher (im onCreate) das String-Array (colorList) befüllt ist und zur Laufzeit nur das setBackgroundColor aufgerufen wird, funktioniert das Einfärben, nur habe ich nichts davon, denn ich möchte zur Laufzeit die ListView mit neuen Einträgen füllen und färben.
Wisst ihr, wie das richtig geht?
Ich färbe es so ein:

Java:
RelativeLayout layout = (RelativeLayout) rowView.findViewById(R.id.list_row_konsole_relativ);

                 
layout.setBackgroundColor(Color.parseColor(vorwarnung));

So kann man für jedes ListView Element eine andere Farbe setzten.
adas ist bei Android so 😉
 
Wo hast du denn die Variable (Instanz von listView) „_listView“ erstellt? Zeige doch den gesamten Code
Bei die fehlt ja die Hälfte.

ps Variablen Bezeichner mit dem Unterstich solltest du dir abgewöhnen das war bei C mal Mode.
 
Habe ich vergessen dazuzuschreiben 😉 Und der ts soll noch ne Bedingung mitsenden, wann der adapter es einfärben soll

Und der ts soll noch ne Bedingung mitsenden, wann der adapter es einfärben soll
Bedingung braucht er nicht. Er will ja den Hex Wert in Liste genau in dieser Farbe darstellen.
Also im Adapter den String in eine Farbe Parsen und dies zu färben benutzen und das will er mit allen Einträgen in der Liste machen .

Wenn Hilfe dann doch auch sinnvoll.
 
Wenn du einen einzelnen Eintrag in der Liste Färben willst.
Dann im Adapter. Dazu schaue nach ListView mit Custom Adapter.
Was ich gesehen habe, ist eine listView.getAdapter().getItem(0) Funktion die ein Object zurückgibt. Auf View lässt sich das Item nicht casten, sonst stürzt die App wieder ab. Ansonsten, habe ich noch nichts gefunden, was mir im Adapter helfen könnte die Farbe zu setzen.

Das ListView-Objekt habe ich im onCreate() erstellt. Hätte ich das versäumt, so hätte der Compiler die App erst gar nicht erstellt.
 
Wo hast du dise Variable _listView estellt? Ist in deinem Code von Post #1 nicht zusehen.

Hier bekommst du deine NPE und die app bricht ab.
 
Zuletzt bearbeitet:
Das gesamte Layout soll nicht eingefärbt werden, sondern nur der eine Eintrag / das eine ListView-Item der/das zur Laufzeit erstellt wird.
So soll das auch verbleiben, unabhängig davon, wieviele Einträge hinzukommen oder wohin gescrollt wird.
Ja das habe ich verstanden. Du übergibst eine Array Liste = {"Obst", "Gemüse", "Obst"} an die Adapter Methode und dann frängst du ab ob es Obst oder Gemüse ist oder ein andere Bedinnung hast und dann setzt du das so wie bei mir die jeweilge Zeile deine Farbe.
 
Bedingung braucht er nicht. Er will ja den Hex Wert in Liste genau in dieser Farbe darstellen.
Also im Adapter den String in eine Farbe Parsen und dies zu färben benutzen und das will er mit allen Einträgen in der Liste machen .

Wenn Hilfe dann doch auch sinnvoll.
Er will das so haben das er einzelne Spalten Makiert:

Screenshot_20231022_201617_Klug_Store[1].jpg
Da übergibt man eine Bedinnung an den Adapter und dieser färb es entsprechend ein, wenn die Bedingung erfüllt ist.
 
Er will das so haben das er einzelne Spalten Makiert:


Da übergibt man eine Bedinnung an den Adapter und dieser färb es entsprechend ein, wenn die Bedingung erfüllt ist.
Ja, so in der Art, nur möchte ich das Item während des Item-Erstellens färben und nicht irgendwann bzw. mit einer Selektion / beim Antippen.

Das hast du nicht.
Du wirst sicherlich ein listview in deinem xml Layout haben.
Aber einen Bezug dazu hast du dir nicht geholt mit findViewById.
Stimmt, ich habe es im 1. Beitrag nicht mit angegeben - in meinem Projekt habe ich auf das findViewById() nicht vergessen - und an dem scheitert es nicht.

Ja das habe ich verstanden. Du übergibst eine Array Liste = {"Obst", "Gemüse", "Obst"} an die Adapter Methode und dann frängst du ab ob es Obst oder Gemüse ist oder ein andere Bedinnung hast und dann setzt du das so wie bei mir die jeweilge Zeile deine Farbe.
Wie bereits im 1. Beitrag erwähnt, funktioniert das Einfärben nur, wenn vorher das Array befüllt ist, an den Adapter übergeben wird und zur Laufzeit ein ListView-Item ausgewählt und eingefärbt wird.
Fülle ich aber das Array während der Laufzeit, setze zur Laufzeit den Adapter und versuche zur Laufzeit das erstellte ListView-Item zu färben, crasht die App.
 
Du brauchst ja den Adapter nicht erneuern wenn du zur Laufzeit etwas deinen ArrayList hinzufügt.

Du brauchst ja nach dem hinzufügen
Nur das neuzeuchen veranlassen.
Zb mit adapter.notifyDataSetChanged()

 
Wenn du jeden Item in deinerListe eime unterschiedliche gestallt zb farbe geben willst. Wirst du um das erstellen eines eigenen Adapter nicht drum rum kommen. In dem adapter kannst du musst die notwendige Logik für das aussehen einbauen.

Hier ein Beispiel fur einen custom Adapter

 
Zuletzt bearbeitet:
Mal eine Frage. Du meist mit einfärben nicht etwa das setzen des Focus?
Was du etweder selber duch abtippen machen kannst oder programmatisch.

 
Du brauchst ja den Adapter nicht erneuern wenn du zur Laufzeit etwas deinen ArrayList hinzufügt.

Du brauchst ja nach dem hinzufügen
Nur das neuzeuchen veranlassen.
Zb mit adapter.notifyDataSetChanged()

Gut, das werde ich dann anpassen.

Mal eine Frage. Du meist mit einfärben nicht etwa das setzen des Focus?
Was du etweder selber duch abtippen machen kannst oder programmatisch.

Nein, ich meinte keinen Fokus oder jegliche Fokusierung der ListView oder eines der Items. Ich möchte nur zur Laufzeit einen Farbwert als Text der ListView übergeben, das besagte Item soll die Hintergrundfarbe entsprechend anpassen und das wars.

Wenn du jeden Item in deinerListe eime unterschiedliche gestallt zb farbe geben willst. Wirst du um das erstellen eines eigenen Adapter nicht drum rum kommen. In dem adapter kannst du musst die notwendige Logik für das aussehen einbauen.

Hier ein Beispiel fur einen custom Adapter

Ich befürchte, mir bleibt nichts anderes übrig.
 

Zurück
Oben