web-dev-qa-db-fra.com

Comment changer la couleur du texte d'un élément de liste simple

J'ai un ListActivity et j'affiche une liste avec:

setListAdapter(new ArrayAdapter<String>(getApplicationContext(),
                Android.R.layout.simple_list_item_single_choice, mStringList));

Par défaut, la couleur du texte des éléments de la liste est blanche. Je souhaite modifier la couleur du texte des vues de texte de la liste en noir. 

Comment devrais-je le faire?

38
User7723337

Une autre méthode la plus simple consiste à créer un fichier de mise en page contenant la vue de texte souhaitée avec textSize, textStyle, couleur, etc., que vous préférez, puis à l’utiliser avec ArrayAdapter.

par exemple. mytextview.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/tv"
    Android:textColor="@color/font_content"
    Android:padding="5sp"
    Android:layout_width="fill_parent"
    Android:background="@drawable/rectgrad"
    Android:singleLine="true"
    Android:gravity="center"
    Android:layout_height="fill_parent"/>

puis utilisez-le avec votre ArrayAdapter comme d'habitude, comme

ListView lst = new ListView(context);
String[] arr = {"Item 1","Item 2"};
ArrayAdapter<String> ad = new ArrayAdapter<String>(context,R.layout.mytextview,arr);
lst.setAdapter(ad);

De cette façon, vous n'aurez pas besoin de créer un adaptateur personnalisé pour cela.

82
dharmin007

Je me rends compte que cette question est un peu ancienne mais voici une solution très simple qui manquait . Vous n'avez pas besoin de créer un ListView personnalisé ni même une présentation personnalisée.

Créez simplement une sous-classe anonyme de ArrayAdapter et substituez getView (). Laissez super.getView () gérer tout le travail lourd. Puisque simple_list_item_1 est simplement une vue de texte, vous pouvez la personnaliser (par exemple, définir textColor), puis la renvoyer.

Voici un exemple d'une de mes applications. J'affiche une liste d'emplacements récents et je souhaite que toutes les occurrences de "Emplacement actuel" soient en bleu et le reste en blanc.

ListView listView = (ListView) this.findViewById(R.id.listView);
listView.setAdapter(new ArrayAdapter<String>(this, Android.R.layout.simple_list_item_1, MobileMuni.getBookmarkStore().getRecentLocations()) {
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        TextView textView = (TextView) super.getView(position, convertView, parent);

        String currentLocation = RouteFinderBookmarksActivity.this.getResources().getString(R.string.Current_Location);
        int textColor = textView.getText().toString().equals(currentLocation) ? R.color.holo_blue : R.color.text_color_btn_holo_dark;
        textView.setTextColor(RouteFinderBookmarksActivity.this.getResources().getColor(textColor));

        return textView;
    }
});
46
Cam Saul

Vous venez de remplacer la méthode getView de ArrayAdapter

ArrayAdapter<String> adapter = new ArrayAdapter<String>(getApplicationContext(), 
        Android.R.layout.simple_list_item_1, mStringList) {
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = super.getView(position, convertView, parent);
        TextView text = (TextView) view.findViewById(Android.R.id.text1);
        text.setTextColor(Color.BLACK);
        return view;
    }
};
35
chip

Le moyen le plus simple de faire cela sans avoir besoin de créer quoi que ce soit d’autre serait de modifier simplement la liste TextView:

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                Android.R.layout.simple_list_item_1, Android.R.id.text1, strings) {
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                TextView textView = (TextView) super.getView(position, convertView, parent);
                textView.setTextColor({YourColorHere});
                return textView;
            }
        };
7
mattfred

En Word "simple, vous ne pouvez pas le faire avec setListAdapter". vous devez utiliser une liste personnalisée pour modifier librement la couleur du texte ou toute autre vue.

pour liste personnalisée, vous pouvez aller avec ce lien

4
Ayudh

vous pouvez utiliser la méthode setTextColor (int) ou ajouter un style pour modifier la couleur du texte.

<style name="ReviewScreenKbbViewMoreStyle">
<item name="Android:textColor">#2F2E86</item>
<item name="Android:textStyle">bold</item>
<item name="Android:textSize">10dip</item>

3
Ajay Singh

Je suis aussi confronté à cette situation. Vous pouvez gérer la méthode ci-dessus. mais simple si vous passez simple_dropdown_item_1line en tant que ressource. Ce sera un texte de couleur noire par défaut.

C'est mon code que j'ai réalisé dans ce genre de situation.

ArrayAdapter<String> arrAdapter = 
new ArrayAdapter<String>(context,Android.R.layout.simple_dropdown_item_1line,countryList);
        listView.setAdapter(arrAdapter);

Votre code ci-dessous:

setListAdapter(new ArrayAdapter<String>(getApplicationContext(),
                Android.R.layout.simple_dropdown_item_1line, mStringList));

En réalité, Android.R.layout.simple_dropdown_item_1line est utilisé pour la liste déroulante. Je vous exhorte à voir ce contenu de mise en page une fois. C'est juste textview simple. c'est tout. Sa propriété n'affectera pas votre tâche. J'ai vérifié que cela fonctionne bien.

Si vous voulez conserver tout le style mais changer quelques détails, vous pouvez utiliser le style par défaut défini sur Android et changer ce que vous voulez.

<TextView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@Android:id/text1"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:textAppearance="?android:attr/textAppearanceListItemSmall"
    Android:gravity="center_vertical"
    Android:textColor="@Android:color/background_light"
    Android:paddingStart="?android:attr/listPreferredItemPaddingStart"
    Android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
    Android:background="?android:attr/activatedBackgroundIndicator"
    Android:minHeight="?android:attr/listPreferredItemHeightSmall" />

Puis définissez l'adaptateur en utilisant:

setListAdapter(new ArrayAdapter<String>(getApplicationContext(),
            R.layout.list_item_custom, mStringList));

Source: https://Android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/res/res/layout/simple_list_item_activated_1.xml

1
Bruno Peres

Si vous créez une classe qui étend un adaptateur, vous pouvez utiliser la variable parent pour obtenir le contexte.

public class MyAdapter extends ArrayAdapter<String> {
private Context context;
   @Override
   public View getView(int position, View convertView, ViewGroup parent) {
       context = parent.getContext();
       context.getResources().getColor(R.color.red);
       return convertView;
   }
}

Vous pouvez faire la même chose avec RecyclerView.Adapter, mais au lieu de getview (), vous utiliserez onCreateViewHolder ().

1
Beto Caldas

Essayez ce code au lieu de Android.r.layout.simple_list_item_single_choice créez votre propre mise en page:

<?xml version="1.0" encoding="utf-8"?>
<CheckedTextView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:checkMark="?android:attr/listChoiceIndicatorSingle"
    Android:gravity="center_vertical"
    Android:padding="5dip"
    Android:textAppearance="?android:attr/textAppearanceMedium"
    Android:textColor="@Android:color/black"
    Android:textStyle="bold">
</CheckedTextView>
1
user2797839

Créez un fichier xml dans res/values ​​et copiez le code ci-dessous 

<style name="BlackText">
<item name="Android:textColor">#000000</item>
</style>

et spécifiez le style en activité dans Manifest comme ci-dessous

 Android:theme="@style/BlackText"
0
Anu