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?
 

wer112

Top Contributor
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 ;)
 

Jw456

Top Contributor
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.
 

Jw456

Top Contributor
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.
 

jerevat

Mitglied
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.
 

Jw456

Top Contributor
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:

wer112

Top Contributor
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.
 

wer112

Top Contributor
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.
 

jerevat

Mitglied
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.
 

Jw456

Top Contributor
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()

 

Jw456

Top Contributor
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:

Jw456

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

 

jerevat

Mitglied
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A ImageButton in ListView Item bei klick ändern Android & Cross-Platform Mobile Apps 3
S Android Studio MySql Daten in Listview mit sub Item Android & Cross-Platform Mobile Apps 11
W ListView fehler: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference Android & Cross-Platform Mobile Apps 5
I Android ListView, Werte aktualisieren ohne die Liste komplett neu zu laden Android & Cross-Platform Mobile Apps 5
W ListView OnItemClicklistener setzen mit Ausgabe Android & Cross-Platform Mobile Apps 35
K Null-Pointer-Exception in ListView - wird über Datenbank gefüllt Android & Cross-Platform Mobile Apps 1
I Android ListView (Custom) soll auf Hardwaretasten nicht reagieren. Android & Cross-Platform Mobile Apps 10
W ListView und Arrays... Android & Cross-Platform Mobile Apps 68
W Android Wieso kann ich keine ListView mehr zum Layout hinzufügen? Android & Cross-Platform Mobile Apps 1
W Android Kann keine ListView mehr in der MainActivtiy anzeigen, obwohl noch sehr viel Platz frei ist Android & Cross-Platform Mobile Apps 1
L ListView aktuallisiert sich nicht Android & Cross-Platform Mobile Apps 15
N Probleme mit custom dynamic ListView Android & Cross-Platform Mobile Apps 15
L Android ListView kollabiert in Scrollview Android & Cross-Platform Mobile Apps 9
J Android Suche in einer ListView Android & Cross-Platform Mobile Apps 3
H Android ArrayList <-> ArrayAdapter <-> ListView Android & Cross-Platform Mobile Apps 10
L Android ListView swipe zum löschen Android & Cross-Platform Mobile Apps 1
B Android ListView set custom check Image and delete Android & Cross-Platform Mobile Apps 0
M Android ListView wird nicht dargestellt Android & Cross-Platform Mobile Apps 2
Maresuke Android Android ListView Textfarbe und Texthintergrund ändern? Android & Cross-Platform Mobile Apps 5
A Android Problem mit ListView und OnItemClickListener.. Android & Cross-Platform Mobile Apps 10
S Listview Einträge aus "xml" Datei Android & Cross-Platform Mobile Apps 1
S Textdatei in ListView einlesen Tutorial gesucht!? Android & Cross-Platform Mobile Apps 3
kaoZ Tutorial .xml Layouting für z.B ListView elemente Android & Cross-Platform Mobile Apps 7
M Android ListView und Checkbox Android & Cross-Platform Mobile Apps 6
L TableRows in ListView darstellen Android & Cross-Platform Mobile Apps 2
M ListView mit ListAdapter füllen Android & Cross-Platform Mobile Apps 5
U Android ListView Frage Android & Cross-Platform Mobile Apps 6
L Android SearchBox für Custom Listview Android & Cross-Platform Mobile Apps 5
H Android ListView Images aus dem Internet via Thread Android & Cross-Platform Mobile Apps 3
T Android: ListView-Adapter: Adapter wird ständig aufgerufen Android & Cross-Platform Mobile Apps 2
H Android SAX|ListView NullPointerException Android & Cross-Platform Mobile Apps 2
A Probleme mit ListView / ArrayAdapter Android & Cross-Platform Mobile Apps 3
J Contextmenu-Item deaktivieren Android & Cross-Platform Mobile Apps 8
A Mit Java neues item in ein string-array einer Strings.xml schreiben Android & Cross-Platform Mobile Apps 4
J Android Studio - ArrayList - Selected Item ermitteln Android & Cross-Platform Mobile Apps 13
B Android wie kann ich in einer xml nach bestimme item suchen (DOM) Android & Cross-Platform Mobile Apps 7
N Android spinner.item index als integer ? Android & Cross-Platform Mobile Apps 10

Ähnliche Java Themen

Neue Themen


Oben