ListView Textfarbe

J

joschika77

Fortgeschrittenes Mitglied
1
Hallo, ich setze die Textfarbe meiner ListView in der *.xml auf Schwarz mit folgender Anweisung:

Code:
android:textColor="#000000"

Leider bleibt die Schriftfarbe Weiß. Kann ich beim ListView nur den Background setzen? Wenn ja find ich sauschlecht.
 
Du musst das Attribut nicht auf die Liste setzen, sondern auf die einzelnen TextView Elemente.

Das heißt, wenn du es nicht eh schon tust, ein eigenes Layout für die Items verwenden, oder im Code via ViewBinder oder eigens angefertigtem Adapter mit SetTextColor() die Farbe verändern.

Ich vermute ersteres wird für dich wohl der einfachere und bessere Weg sein.
 
Hmmm...ne leider tue ich es noch nicht. Ich benutze einen ArrayAdapter. Das muß auch dynamisch sein.Wie kann ich das dem Adapter unterjubeln? Ich benutze im code folgendes:

Code:
        myPostingTypeLV  = (ListView) findViewById(R.id.postingTypeListView);
        ArrayAdapter<String> adapterPos = new ArrayAdapter<String>(this,android.R.layout.simple_gallery_item,
                aAllCategories);
        myPostingTypeLV.setAdapter(adapterPos);
        myPostingTypeLV.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() 
        {
            public void onItemSelected(AdapterView parentView, View childView, int position, long id) 
            {
            }
            public void onNothingSelected(AdapterView parentView) 
            {
                //nothing to do
            }
         });
 
Ok das hab ich soweit. Was is das? Kann ich das mit meiner Farbe ersetzen?

Code:
android:textColor="?android:attr/textColorPrimaryDisableOnly"
 
joschika77 schrieb:
Ok das hab ich soweit. Was is das? Kann ich das mit meiner Farbe ersetzen?

Code:
android:textColor="?android:attr/textColorPrimaryDisableOnly"

Das ist eine Referenz auf ein Attribut im aktuellen Theme. D.h. z.B. je nach dem ob du den Light oder den Dark Style verwendest, oder ob zum Beispiel ein Handy wie das Hero eine andere Farbe für die Auswahl verwendet, werden hier automatisch die richtigen Farben verwendet.

Du kannst den Wert einfach mit deiner eigenen Farbe ersetzen, richtig. Im Optimalfall würdest du natürlich eine Statelist von Farben verwenden, damit du auch bei ausgewählten/gedrückten/deaktivierten Items etc. die richtige Textfarbe hast, falls notwendig.
 
Leider klappt das auch nicht. Die Farbe wird nicht gesetzt. :confused:
Wie sieht es mit dieser Methode aus?
Code:
myPostingTypeLV.setSelection(aPosIndex);
Die scheint auch nicht zu funktionieren. Seltsam! Seltsam!
 
bastel dir deinen eigenen adapter und überschreib die getView methode

das funktioniert ganz sicher
 
joschika77 schrieb:
Leider klappt das auch nicht. Die Farbe wird nicht gesetzt. :confused:

Du musst etwas falsch gemacht haben, denn: Ich hab das auch schon gemacht, und es klappte.

Poste mal mehr von dem Code den du verwendest.
 
Hallo.

Das ist die simple_gallery_item.xml.Soll dann die Textfarbe Schwarz haben.
Code:
<?xml version="1.0" encoding="utf-8"?>

<!-- android:textColor="?android:attr/textColorPrimaryDisableOnly" -->
<TextView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1"
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:textColor="#000000"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:maxLines="1"/>
Und das ist in der onCreate Methode vom Activity
Code:
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        myPostingTypeLV  = (ListView) findViewById(R.id.postingTypeListView);
        myAdapterPos = new ArrayAdapter<String>(this,android.R.layout.simple_gallery_item,
                myPostingTypes);
        myPostingTypeLV.setAdapter(myAdapterPos);
        myPostingTypeLV.setSelection(aPosIndex);
        myPostingTypeLV.setOnItemClickListener(new OnItemClickListener()
        {
            public void onItemClick(AdapterView<?> parentView,View childView,int position,long id) 
            {    
                ECategoryPostingTypeActivity.this.setResult(Activity.RESULT_OK,
                    new Intent(myPostingTypes[position]));
                ECategoryPostingTypeActivity.this.finish();
            }            
        });        
    }
Hoffe das der Code reicht. Wenn was fehlt nochmal posten. Warum funktioniert die setSelection Methode nicht?
 
was ist aPosIndex???

sehe da nicht, welchen wert das haben könnte.
 
na der wert ist 0,1 oder 2. Das ist auch der richtige Index. Hab ich durchdebuggt. Muß ich vielleicht den Focus noch setzen? Es soll so aussehen als wenn eine Zeile den Fokus hat.
 
hmm hat setselection überhaupt eine auswirkung auf eine listview? die listview zeigt ja sowieso generell alle items ( soviel halt platz )
 
Hmmm ja vielleicht ist er ja selected und markiert es halt nur nicht, weil die Methode es gar nicht so macht. Dazu muß ich vielleicht den Fokus setzen. Sag mal kann man den Adapter nachträglich nicht mehr ändern? Also in der Laufzeit keine neuen Items einfügen oder löschen? wenn ich das machen will hab ich da so eine Exception die sowas ähnliches sagt. Das wäre sehr schlecht wenn das so ist.
 
Du verwendest nach wie vor "android.R.layout.simple_gallery_item" (das Original), nicht dein eigenes: "R.layout.simple_gallery_item".
 
nenn es anders, dann gibts da auch keine missverständnisse

anstatt android.R.layout.simple_gallery_item
musst du
R.layout.myCoolGalleryItem nehmen
 
joschika77 schrieb:
Hmmm ja vielleicht ist er ja selected und markiert es halt nur nicht, weil die Methode es gar nicht so macht. Dazu muß ich vielleicht den Fokus setzen. Sag mal kann man den Adapter nachträglich nicht mehr ändern? Also in der Laufzeit keine neuen Items einfügen oder löschen? wenn ich das machen will hab ich da so eine Exception die sowas ähnliches sagt. Das wäre sehr schlecht wenn das so ist.

Doch das geht prinzipiell auf jeden Fall: Daten ändern und Adapter.notifyDataSetChanged() aufrufen.

Der ArrayAdapter hat Methoden wie add() und delete(), die das für dich erledigen müssten.
 
Bezüglich setSelection(): Hier ist das Problem wohl der Unterschied zwischen Touch-Mode und Focus-Mode.

Sobald man den Bildschirm berüht, geht die Oberfläche in besagten Touch-Mode, und Focus und Selektion wird dann nur noch in Ausnahmefällen angezeigt (View | Android Developers)).

Du setzt also die Selection, und wenn du dann mit dem Trackball (oder den Pfeiltasten) nach oben oder unten navigierst, sollte es von deiner gesetzten Position aus passieren, aber solange du noch im Touch-Mode bist, wird nichts angezeigt.
 
miracle2k schrieb:
Doch das geht prinzipiell auf jeden Fall: Daten ändern und Adapter.notifyDataSetChanged() aufrufen.

Der ArrayAdapter hat Methoden wie add() und delete(), die das für dich erledigen müssten.

Die Methoden hatte ich gefunden aber er schmeisst immer ne Exception wenn ich was rausschmeißen will. Zuerst hatte ich die Methode clear(). Jetzt habe ich mal die Remove() Methode versucht. Aber nichts da. Immer geht er in den UnsupportedOperationException Block. Deswegen meine Frage ob das überhaupt geht Gut ist ja schon mal zu hören/lesen das es grundsätzlich geht.

Also die neuen Items hängen mit dem Wechsel des SpinnerItems zusammen, mein Code dazu derzeit:

Code:
        myCategorySpinner.setOnItemSelectedListener(new OnItemSelectedListener()
        {

            public void onItemSelected(AdapterView<?> parent,View v,int position,long id) 
            {
                    try
                    {
                    for(int i=myPostingTypes.length-1;i>=0;i--)
                        myAdapterPos.remove(myPostingTypes[i]);
                    
                    myCurrentCategory = myCategorySpinner.getSelectedItem().toString();
                    myPostingTypes = myDBConnection.getAllPostingTypesFromCurrentCategory(myCurrentCategory);
                    
                    for(int i=0;i<myPostingTypes.length;i++)
                        myAdapterPos.add(myPostingTypes[i]);
                    
                    myAdapterPos.notifyDataSetChanged();
                    }
                    catch(UnsupportedOperationException uep)
                    {
                        Log.i(TAG,uep.getMessage());
                    }
                    catch(Exception e)
                    {
                        Log.i(TAG,e.getMessage());
                    }                    
            }
 
ist das nicht .remove(Object); ??
 

Ähnliche Themen

A
Antworten
10
Aufrufe
1.021
swa00
swa00
D
Antworten
9
Aufrufe
1.765
jogimuc
J
J
  • JoEntwickler
Antworten
0
Aufrufe
974
JoEntwickler
J
Zurück
Oben Unten