einzelne Textelemente einer ListView ändern

N

nijoX

Neues Mitglied
5
Moin,

ich würde gerne im nachhinein, je nach dem welchen Status meine Strings in der ListView haben, die Textfarbe anpassen. z.B. nach dem motto
aString.getState(); --> böses a --> Färbe den Text in der ListView rot darstellen.

Meine liste baue ich so zusammen:

list.setAdapter(new ArrayAdapter<String>(this, (R.layout.main),items));
items.add("a: " + aString);
items.add("b: " +bString);
items.add("c: " + cString);


a b und cString bekomme ich von einer anderen Activity. Dort wird auch der Status der Strings festgelegt und mit an die ListViewActivity übergeben.

Ich hoffe jemand kennt eine Lösung zu dem Problem (oder hat mehr Googleskill als ich :D)

MfG nijoX
 
Zuletzt bearbeitet:
du musst die getView-Methode vom ArrayAdapter überschreiben und dort die Farbe setzen.
 
Hab das mit der getView Methode überschreiben mal versucht aber ich bekomm es einfach nicht hin

wäre es möglich eine genauere Beschreibung zu geben wie ich die getView Methode so überschreiben kann das es einzelne Elemente färben kann.


MfG nijoX
 
poste doch mal den code von deinem adapter, dann kann vielleicht besser geholfen werden ;-)
 
genau da liegt das Problem ich steh mit dem eigenem Adapter schreiben total aufm Schlauch. Hab mir schon einige Beispiele im Netz angeschaut, selber versucht per Doku einen Adapter aufzubauen, aber bis jez hat nichts auch nur im Ansatz funktioniert.

Momentan sieht der Adapter nur noch so aus.

Code:
    public final class myArrayAdapter extends ArrayAdapter<String>{
        private LayoutInflater layoutinf;
        private int i;
        public myArrayAdapter(Context context, int resource, int textViewResourceId, int i) {
            super(context, resource, textViewResourceId);
            this.i = i;
            layoutinf = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            
           }
        @Override
        public View getView(int position, View convertView, ViewGroup parent){
    /**setzen der nächsten textview je nach dem welches i übergeben 
       *wurde. die textviews sind jeweils in eigenen xml datein gespeichert*/
            convertView = layoutinf.inflate(i, null);
            return convertView;
        }

    }
ist aber auch nur einem Beispiel aus dem Internet nachgeahmt

xml Code zu den Textviews:

HTML:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/warnmessage"
    android:layout_width="fill_parent" android:layout_height="wrap_content"
    android:padding="10dp" android:textSize="16sp" android:textColor="#0ff"
    android:textStyle="italic">
</TextView>
die Anderen Views die in der ListView dargestellt werden sollen sehen genau so aus nur mit einer anderen Farbe eben :)

Hoffe das mir jetzt jemand weiter"er" helfen kann :)

MfG nijoX
 
Also zuerst einmal würde ich deinem Array-Adapter auch das tatsächliche Objekt übergeben und nicht nur einfach nen String. Weil, wie willst du sonst später auf .getState() zugreifen um zu entscheiden, welche Farbe du setzen willst?

Hier ist mal ein Adapter von mir, der das Objekt "DBItem" handelt:

Code:
package comet.android;

import java.text.SimpleDateFormat;
import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;


public class DBItemArrayAdapter extends ArrayAdapter<DBItem> {

    int resource;
    private SimpleDateFormat sdf;
    private TableLayout dbItemsView;
    
    
    public DBItemArrayAdapter(Context context, int resourceId, List<DBItem> dbItems) {
        super(context, resourceId, dbItems);
        this.resource = resourceId;
        this.sdf = new SimpleDateFormat("dd.MM.yyyy");
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        DBItem item = getItem(position);
        
        if (convertView == null) {
            dbItemsView = new TableLayout(getContext());
            LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            inflater.inflate(resource, dbItemsView, true);            
        }
        else {
            dbItemsView = (TableLayout)convertView;
        }
        
        TextView id = (TextView)dbItemsView.findViewById(R.id.tv_item_id);
        TextView name = (TextView)dbItemsView.findViewById(R.id.tv_item_name);
        TextView vorname = (TextView)dbItemsView.findViewById(R.id.tv_item_vorname);
        TextView datum = (TextView)dbItemsView.findViewById(R.id.tv_item_datum);
        TextView flag = (TextView)dbItemsView.findViewById(R.id.chk_item_flag);
        
        id.setText(item.getId().toString());
        name.setText(item.getName());
        vorname.setText(item.getVorname());
        datum.setText(item.getDatum());
        flag.setText(sdf.format(item.getDate()));
        
        
        final TableRow rowItem = (TableRow)dbItemsView.findViewById(R.id.item_row);
        if (position % 2 == 0) {
            rowItem.setBackgroundResource(R.drawable.drawable_even_color);
        }
        else {
            rowItem.setBackgroundResource(R.drawable.drawable_odd_color);
        }
        
        return dbItemsView;
    }
    
}

und in der Activity siehts dann so aus:
Code:
        dbItems = new ArrayList<DBItem>();
        
        itemsAdapter = new DBItemArrayAdapter(this, R.layout.table_item_new, dbItems);
        listView.setAdapter(itemsAdapter);


Wenn du getView() überschreibst, dann machst du quasi selbst das Mapping (die Zuordnung der Daten zu den einzelnen Widgets wie TextView, EditText, etc.).

Über die IDs kannst du dir die Widgets holen (z.b. TextView id = (TextView)dbItemsView.findViewById(R.id.tv_item_id);) und dann z.b. den Text setzen/ändern (z.b. id.setText(item.getId().toString());) oder andere Eigenschaften setzen, u.a. könntest du dann hier z.b. die Textfarbe ändern (z.b. id.setTextColor(Color.RED);).

In deinem Fall mußt du halt je nach Status die Farbe setzen, dafür brauchst du dein Objekt, um auf den Status hier zugreifen zu können. Also DBItem mußte dann gegen dein Objekt austauschen.

Ich glaube, du brauchst dann auch nur eine Layout-Datei, wenn du nur die Farben ändern mußt.

Hoffe, das hilft dir weiter :)
 
  • Danke
Reaktionen: nijoX
Den Status geb ich Momentan in einem String Array mit

Code:
String[] data = {"Value", "1"}; 
nextActivity.putExtra(name, data);

im Prinzip hab ich vor in nextActivity dann nen switchblock zu bauen wo es sich dann entscheidet welche Farbe gesetzt wird

Weiter is auch noch das Problem das ichs so nicht bnachbauen kann (zumindest nicht genau so), da es vorher der nextActivity unbekannt ist wie viele Elemente es schließlich werden. Werd mich jetzt aber erstmal mit deiner Hilfe weiter dran versuchen ... Ich melde mich dann ob es geklappt hat ;)

MfG nijoX
 
Hab mein Problem nun gelöst bekommen.

Für alle die ebenfalls auf so ein Problem stoßen hier meine Lösung



Code:
        public final class OwnAdapter extends ArrayAdapter<String[]>{
            List<String[]> array;
            public OwnAdapter(Context context, int resourceId, List<String[]> array) {
                super(context, resourceId, array);
                this.array = array;
            }
            
            public View getView (int position, View convertView, ViewGroup parent){
                TextView v = (TextView)super.getView(position, convertView, parent);
                    String[] temp = array.get(position);
                if(temp[1].equals("0")){
                    v.setText(temp[0]);
                    Log.i("STRING", temp[0]+"   "+position+"  normal");
                    v.setTextColor(Color.BLUE);
                }else if(temp[1].equals("1")){
                    v.setText(temp[0]);
                    Log.i("STRING", temp[0]+"   "+position+"  warnung");
                    v.setTextColor(Color.YELLOW);
                }else if(temp[1].equals("2")){
                    v.setText(temp[0]);
                    Log.i("STRING", temp[0]+"   "+position+"  Kritisch");
                    v.setTextColor(Color.RED);

                    }
                
                
                return v;
            }


ist nicht die besste Lösung mit einem String[] zu Arbeiten aber wird noch gefixt und bald als Parcelable Objekt an den Adapter gegeben

MfG nijoX
 

Ähnliche Themen

A
Antworten
10
Aufrufe
1.002
swa00
swa00
D
  • Data2006
Antworten
14
Aufrufe
437
jogimuc
J
D
Antworten
14
Aufrufe
1.616
chrs267
chrs267
Zurück
Oben Unten