Mettre en évidence ListView ligne sélectionnée

j'ai une liste d'albums (plusieurs centaines). Quand je touche l'album sélectionné, je veux offrir à l'utilisateur un choix de jouer l'album entier, ou de passer à son ListView piste. Pas de problème. Cependant, après avoir touché l'ablum dans albumListView, je veux que la ligne reste surlignée pour que l'utilisateur sache sur quel élément il a cliqué, et puisse ensuite passer à OK ou jouer. Comment mettre en évidence une rangée dans ListView?

37
demandé sur theFunkyEngineer 2011-02-20 19:23:40

12 réponses

Cité de http://android-developers.blogspot.de/2008/12/touch-mode.html

Imaginez une application simple, ApiDemos par exemple, qui montre une liste d'éléments de texte. L'utilisateur peut librement naviguer dans la liste en utilisant la boule de commande, mais aussi, alternativement, faire défiler et lancer la liste en utilisant l'écran tactile. La question dans ce scénario est de savoir comment gérer correctement la sélection lorsque l'utilisateur manipule la liste à travers l'écran tactile.

Dans ce cas, si l'utilisateur sélectionne un élément en haut de la liste, puis jette la liste vers le bas, ce qui devrait arriver à la sélection? Doit-il rester sur l'article et défiler hors de l'écran? Que se passe-t-il si l'utilisateur décide alors de déplacer la sélection avec la boule de commande? Ou pire, qu'arriverait-il si l'utilisateur appuie sur la boule de commande pour agir sur l'élément actuellement sélectionné, ce qui n'est pas affiché sur l'écran, plus?

Après mûre réflexion, nous avons décidé de supprimer la sélection tout à fait, lorsque l'utilisateur manipule L'UI à travers l'écran tactile.

en mode touch, il n'y a ni focus ni sélection. l'élément sélectionné dans une liste de dans une grille est désactivée dès que l'utilisateur passe en mode tactile. De même, tout widget focalisé devient non focalisé lorsque l'utilisateur entre en mode touch. L'image ci-dessous illustre ce qui arrive lorsque l'utilisateur touche une liste après avoir sélectionné un élément avec l' trackball.

35
répondu Maaalte 2013-11-02 17:20:26

Autre solution (surtout en XML)

1) Réglez le choiceModeListViewsingleChoice

<ListView
    android:choiceMode="singleChoice"
.../>

2) les Éléments de la liste doivent être un Vérifiable voir et utiliser un Couleur De L'Etat Liste comme arrière-plan

ex: album_item.xml

<?xml version="1.0" encoding="utf-8"?>
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
   android:background="@drawable/list_selector"
.../>

3) L'état de couleur du fond (list_selector.xml) définit la couleur de surbrillance

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/green" android:state_checked="true"/>
    <item android:drawable="@color/green" android:state_pressed="true"/>
</selector>
42
répondu Hiep 2012-10-31 22:06:40

Maaalte est correct, en mode touch les listes ne montrent pas le focus sur un item courant car il n'y a pas d'item courant en mode touch. Sélection Stateful comme vous décrivez qui persiste pendant que vous interagissez avec d'autres parties de L'UI est une autre question cependant.

vous pouvez utiliser CHOICE_MODE_SINGLE pour exprimer une sélection stateful dans une liste. Il traitera la sélection comme un état vérifié. Tant que la vue que votre adaptateur retourne implémente l'interface vérifiable, vous pouvez afficher l'état sélectionné comme vous le souhaitez. (Mise en place d'un arrière-plan sur la vue d'item ou autre. Il n'a pas réellement besoin d'afficher un widget de case à cocher.) Vous pouvez ensuite utiliser les méthodes ListView vérifiées pour manipuler ou déterminer la sélection.

19
répondu adamp 2011-02-20 17:06:36

j'ai résolu ce problème en étendant ListView et en remplaçant la méthode getView (). J'ai gardé un identificateur interne pour la "sélection" de l'etat et changé l'arrière-plan de l'élément en fonction, comme ceci:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
View currView = super.getView(position, convertView, parent);
StateListItem currItem = getItem(position);
if (currItem.isItemSelected) {
    currView.setBackgroundColor(Color.RED);
} else {
    currView.setBackgroundColor(Color.BLACK);
}
return currView;
}  

j'ai un programme d'exemple sur mon blog: http://udinic.wordpress.com/2011/07/01/selectablelistview-make-selection-work/

12
répondu Udinic 2012-05-14 13:59:11

Voici ma solution Listview:

<ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/white"
        android:divider="@android:color/darker_gray"
        android:dividerHeight="1dp"
        android:paddingLeft="10dip"
        android:paddingRight="10dip"
        android:choiceMode="singleChoice"
        android:paddingTop="8dip" >
    </ListView>

Écrire un sélecteur pour list_row comme

<!-- <item android:drawable="@color/android:transparent"  android:state_selected="true" /> -->
<item android:drawable="@android:color/darker_gray" android:state_selected="true"/>
<item android:drawable="@android:color/darker_gray" android:state_activated="true"/>    
<item android:drawable="@android:color/darker_gray" android:state_pressed="true"/>
<item android:drawable="@color/android:transparent"/>

Assurez-vous que vous avez l'article pour state_activated=true

puis ajoutez ce sélecteur comme arrière-plan list_row

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="@drawable/listitem_selector"
  android:orientation="vertical" >

<TextView
    android:id="@+id/itemName"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

11
répondu subair_a 2014-04-23 06:04:47

ajouter android:background="?activatedBackgroundIndicator

à l'élément de la liste principale mise en page similaire à android.R.layout.simple_list_item_activated_2.xml

6
répondu denis 2013-04-11 08:35:03

implémentez votre liste avec le mode à choix unique:android:choiceMode=singleChoice

comme par défaut android.R.layout.simple_list_item_single_choice utilise un RadioButton pour indiquer le choix sélectionné, vous pouvez implémenter un État de surbrillance personnalisé ou similaire dans la mise en page de votre élément de liste pour répondre aux changements de choix. Des méthodes comme getCheckedItemPosition() peut être utilisé par votre application pour déterminer l'élément sur lequel l'utilisateur a choisi, si nécessaire.

j'Espère que ça Aide!

5
répondu Devunwired 2011-02-20 16:58:09

je sais que cela fait deux ans que cette question n'a pas été active pour la dernière fois, mais juste au cas où quelqu'un d'autre en aurait besoin à l'avenir. Voici mon code xml ListView

<ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/results"
        android:choiceMode="singleChoice"
        android:listSelector="#ffdb700b"/>

vous voulez changer le android:listSelector valeur.

4
répondu jrsall92 2015-07-31 08:13:25

solution Suivante peut être utilisée pour mettre en évidence un ou plusieurs éléments de la liste. Point de départ: il y a un ListFragment pour afficher une liste de MyEntity via une implémentation ArrayAdapter. La couleur D'un TextView faisant partie de la mise en page d'un élément doit être changée en gris, si l'élément est sélectionné. Plusieurs éléments doivent être sélectionnables.

  1. le ListFragment doit fournir un OnItemSelectListener (votre élément D'identité) qui sera appelé en onListItemClicked ().

    public void onListItemClick(ListView l, View v, int position, long id) {
      MyEntity entity = (MyEntity) getListView().getItemAtPosition(position);
      if (entityListSelectListener != null) 
        itemSelectListener.onItemSelect(entity); }
    
  2. le ArrayAdapter possède une liste pour les champs clés pour les éléments sélectionnés et fournit les méthodes de manager addSelection(MyEntity) et clearAllSelections(). La méthode overriden getView () lit la liste des champs clés et, si la position réelle y est, Change la couleur particulière de TextView en gris, sinon en transparent.

    public View getView(int position, View convertView, ViewGroup parent) {
      ...
      if (selectedEntityList.contains(entity.key)) //... highlight view field }
    
  3. Dans onCreate() de la possession d'activité, les auditeurs doit être implémenté pour gérer le Tableauadapter: calling addSelection() et notifydatasechanged().

    entityListFragment.setEntityListSelectListener(
      new EntityListFragment.OnItemSelectedListener() {
        public void onItemSelect(MyEntity entity) {
        aa.addSelection(entity);
        aa.notifyDataSetChanged(); }});
    
3
répondu Christian Schulzendorff 2012-12-13 21:50:56

j'ai eu le même problème, je l'ai résolu en collant le code suivant dans le code ListView

android:choiceMode="singleChoice"
android:listSelector="#003366"

le fichier xml ressemble à

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">

<ListView
    android:id="@+id/file_list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:choiceMode="singleChoice"
    android:listSelector="#003366"/>

<Button
    android:id="@+id/select"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="SELECT"
    android:layout_below="@id/file_list"/>

</RelativeLayout>
2
répondu Rijul Gupta 2014-05-31 17:26:06

dans mon cas, lors de l'utilisation de simple_list_item_2, la seule solution était de surcharger la méthode getView () de l'adaptateur, et juste de changer la couleur de fond manuellement:

listview = new SimpleAdapter(ctx, data,
                android.R.layout.simple_list_item_2, res,
                new String[] {"field1", "field2" },
                new int[] {android.R.id.text1, android.R.id.text2 })

            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                View view = super.getView(position, convertView, parent);

                if (this_is_the_selected_item)
                {
                    view.setBackgroundColor(0xff999999);
                }
                else
                {
                    view.setBackgroundColor(Color.BLACK);
                }
                return view;
            }
        };

n'oubliez pas d'appeler la liste.invalidateViews () chaque fois que vous changez l'élément sélectionné.

1
répondu CpnCrunch 2015-06-29 21:41:58

voici ce que j'ai fait:) - après que la tête s'est cognée contre le mur.

pour l'adaptateur:

 radioAdapter = new RadioAdapter(context, R.layout.row_layout, yourData);

pour le row_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/radio_name"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center_vertical"
android:padding="10dp"
android:background="?android:attr/activatedBackgroundIndicator"
android:clickable="true"
android:text="SOME RADIO"
android:textColor="@color/Gray"
android:textSize="25dp" />

pour définir une position par défaut à mettre en évidence, faites simplement ceci à votre objet listView:

radioTitleList.setItemChecked (defaultPosition, true);

Si vous souhaitez en surbrillance lorsque vous cliquez sur la liste:

Dans votre getView() dans votre liste personnalisée ajouter ceci avant de retourner la vue:

 row.setOnClickListener(new OnClickListener() 
 {
 @Override
 public void onClick(View arg0) 
 {
     radioTitleList.setItemChecked(position, true);
             // other stuff like navigating to a new activity etc
     }
 });
0
répondu ryvianstyron 2013-08-08 16:51:04