web-dev-qa-db-fra.com

Comment changer la couleur des éléments ListView sur le focus et sur le clic

j'ai une liste Voir dans mon application (c'est la mise en page XML):

   <?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:Android="http://schemas.Android.com/apk/res/Android"
       Android:id="@+id/arrayList"
       Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
       Android:textFilterEnabled="true"
       Android:scrollbars="vertical"
       Android:drawSelectorOnTop="true">
</ListView>

Chaque élément de ma liste est composé de deux TextView:

    <?xml version="1.0" encoding="utf-8"?>
<TableLayout Android:layout_width="fill_parent"
       xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/row_container"
       Android:padding="5px" Android:layout_height="wrap_content"
       Android:background="@color/white" Android:shrinkColumns="0">
               <TableRow>
               <TextView Android:layout_height="wrap_content"
                       Android:layout_width="wrap_content" Android:layout_below="@+id/
description"
                       Android:id="@+id/description"
                       Android:textColor="@color/black"
                       Android:scrollHorizontally="true"
                       Android:singleLine="true"></TextView>
       </TableRow>
       <TableRow>
               <TextView Android:layout_width="wrap_content"
                       Android:layout_height="wrap_content" Android:id="@+id/result"
                       Android:textColor="@color/grey"
                       Android:maxLines="1"
                       Android:scrollHorizontally="true"></TextView>
       </TableRow>

</TableLayout>

Je remplis mon listView à partir d'un ArrayAdapter, de cette façon:

public class Matches extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);        
    //set layout

    setContentView(R.layout.list_layout);
  // obtain reference to listview
  ListView listView = (ListView) findViewById(R.id.arrayList);

  ArrayAdapter<Match> arrayAdapter = new ArrayAdapter<Match>(
        this, R.layout.custom_row, R.id.description, createItems()) {

     @Override
     public View getView (int position, View convertView, ViewGroup parent){
        Match item = getItem (position);
        LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View rowView = inflater.inflate(R.layout.custom_row, null);
        TextView description = (TextView)rowView.findViewById(R.id.description);
        TextView result = (TextView)rowView.findViewById(R.id.result);
        description.setText(item.description + "  Risultato: " + item.result );
        result.setText(item.date + "  " + item.hour);
        return rowView;
     }
  };

  listView.setAdapter(arrayAdapter);

Mon objectif est de pouvoir modifier la couleur du texte et l’arrière-plan de ces vues enfants lorsque le parent est sélectionné ou activé.

Comment puis-je le faire?

27
nolanofra

Les vues enfants de votre ligne de liste doivent être considérées comme sélectionnées chaque fois que la ligne parent est sélectionnée. Vous devez donc pouvoir définir une liste de couleurs/couleurs pouvant être dessinée dans les états que vous souhaitez modifier. Voir ce SO post .

Spécifiquement, vous définiriez la textColor de votre textViews sur une ressource XML comme celle-ci:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_focused="true" Android:drawable="@color/black" /> <!-- focused -->
    <item Android:state_focused="true" Android:state_pressed="true" Android:drawable="@color/black" /> <!-- focused and pressed-->
    <item Android:state_pressed="true" Android:drawable="@color/green" /> <!-- pressed -->
    <item Android:drawable="@color/black" /> <!-- default -->
</selector> 
37
Yoni Samlan

Dans votremain.xml, incluez ce qui suit dans votre ListView:

Android:drawSelectorOnTop="false"

Android:listSelector="@Android:color/darker_gray"
31
Anil Arigela
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android" >    
    <item Android:state_pressed="true" Android:drawable="@drawable/YOUR DRAWABLE XML" /> 
    <item Android:drawable="@drawable/YOUR DRAWABLE XML" />
</selector>
5
Dhiral Pandya

Voici un bon article sur l'utilisation des sélecteurs avec des listes.

Au lieu de le définir comme étant le fond Android de ListView, je pense que vous souhaitez configurer Android: listSelector comme indiqué ci-dessous:

<ListView Android:id="@+id/list" 
  Android:layout_width="fill_parent"
  Android:layout_height="wrap_content" 
  Android:layout_gravity="center"
  Android:divider="@null" 
  Android:dividerHeight="0dip"
  Android:listSelector="@drawable/list_selector" />
4
fuliozor
listview.setOnItemLongClickListener(new OnItemLongClickListener() {

        @Override
        public boolean onItemLongClick(final AdapterView<?> parent, View view,
                final int position, long id) {
            // TODO Auto-generated method stub

             parent.getChildAt(position).setBackgroundColor(getResources().getColor(R.color.listlongclick_selection));

            return false;
        }
    });
1
Vinay

Déclarez les composants d'élément de liste en tant que final en dehors de setOnClickListener ou de ce que vous souhaitez appliquer à votre élément de liste, comme ceci:

final View yourView;
final TextView yourTextView;

Et en remplaçant onClick ou la méthode que vous utilisez, définissez les couleurs selon vos besoins, comme suit: 

yourView.setBackgroundColor(Color.WHITE/*or whatever RGB suites good contrast*/);
yourTextView.setTextColor(Color.BLACK/*or whatever RGB suites good contrast*/);

Ou sans la déclaration finale, si vous implémentez un onClick () pour qu'un adaptateur personnalisé remplisse une liste, voici ce que j'ai utilisé dans getView () pour mon setOnClickListener/onClick ():

//reset color for all list items in case any item was previously selected
for(int i = 0; i < parent.getChildCount(); i++)
{
  parent.getChildAt(i).setBackgroundColor(Color.BLACK);
  TextView text=(TextView) parent.getChildAt(i).findViewById(R.id.item);
  text.setTextColor(Color.rgb(0,178,178));
}
//highlight currently selected item
 parent.getChildAt(position).setBackgroundColor(Color.rgb(0,178,178));
 TextView text=(TextView) parent.getChildAt(position).findViewById(R.id.item);
 text.setTextColor(Color.rgb(0,178,178));
0
Callin'

Très vieux mais je viens de me débattre avec ça, c'est comme ça que je l'ai résolu en xml pur. Dans res/values ​​/ colors.xml j’ai ajouté trois couleurs (la color _... );

<resources>

    <color name="black_overlay">#66000000</color>

    <color name="colour_highlight_grey">#ff666666</color>
    <color name="colour_dark_blue">#ff000066</color>
    <color name="colour_dark_green">#ff006600</color>

</resources>

Dans le dossier res/drawable que j'ai créé listview_colours.xml qui contenait;

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:drawable="@color/colour_highlight_grey" Android:state_pressed="true"/>
    <item Android:drawable="@color/colour_dark_blue" Android:state_selected="true"/>
    <item Android:drawable="@color/colour_dark_green" Android:state_activated="true"/>
    <item Android:drawable="@color/colour_dark_blue" Android:state_focused="true"/>
</selector>

Dans main_activity.xml , recherchez la vue Liste et ajoutez le dessinable à listSelector ;

<ListView
    Android:id="@+id/menuList"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:listSelector="@drawable/listview_colours"
    Android:background="#ff222222"/>
</LinearLayout>

Jouez avec les éléments state _... de listview_colours.xml pour obtenir l’effet souhaité.

Il existe également une méthode permettant de définir le style de la liste mais je n’ai jamais réussi à la faire fonctionner.

0
Recycled Steel