1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

einzelne Textelemente einer ListView ändern

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von nijoX, 16.09.2011.

  1. nijoX, 16.09.2011 #1
    nijoX

    nijoX Threadstarter Junior Mitglied

    Beiträge:
    38
    Erhaltene Danke:
    5
    Registriert seit:
    06.09.2011
    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: 16.09.2011
  2. sixi, 16.09.2011 #2
    sixi

    sixi Erfahrener Benutzer

    Beiträge:
    237
    Erhaltene Danke:
    64
    Registriert seit:
    20.01.2009
    du musst die getView-Methode vom ArrayAdapter überschreiben und dort die Farbe setzen.
     
  3. nijoX, 19.09.2011 #3
    nijoX

    nijoX Threadstarter Junior Mitglied

    Beiträge:
    38
    Erhaltene Danke:
    5
    Registriert seit:
    06.09.2011
    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
     
  4. Tom299, 19.09.2011 #4
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    poste doch mal den code von deinem adapter, dann kann vielleicht besser geholfen werden ;-)
     
  5. nijoX, 20.09.2011 #5
    nijoX

    nijoX Threadstarter Junior Mitglied

    Beiträge:
    38
    Erhaltene Danke:
    5
    Registriert seit:
    06.09.2011
    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
     
  6. Tom299, 20.09.2011 #6
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    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 :)
     
    nijoX bedankt sich.
  7. nijoX, 20.09.2011 #7
    nijoX

    nijoX Threadstarter Junior Mitglied

    Beiträge:
    38
    Erhaltene Danke:
    5
    Registriert seit:
    06.09.2011
    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
     
  8. Tom299, 20.09.2011 #8
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    nijoX bedankt sich.
  9. nijoX, 22.09.2011 #9
    nijoX

    nijoX Threadstarter Junior Mitglied

    Beiträge:
    38
    Erhaltene Danke:
    5
    Registriert seit:
    06.09.2011
    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
     

Diese Seite empfehlen