élément sélectionné dans une vue de liste personnalisée avec une barre d’action contextuelle

J’ai récemment commencé à utiliser des barres d’action android et des barres d’action contextuelles (CAB).

Je n’ai qu’une activité qui est une ListActivity. En gros, j’utilise le code suivant pour “activer” le CAB:

ListView listView = getListView(); listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); listView.setMultiChoiceModeListener(new MultiChoiceModeListener() { @Override public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) { // Here you can do something when items are selected/de-selected, // such as update the title in the CAB } @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { // Respond to clicks on the actions in the CAB switch (item.getItemId()) { case R.id.menu_delete: deleteSelectedItems(); mode.finish(); // Action picked, so close the CAB return true; default: return false; } } @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { // Inflate the menu for the CAB MenuInflater inflater = mode.getMenuInflater(); inflater.inflate(R.menu.context, menu); return true; } @Override public void onDestroyActionMode(ActionMode mode) { // Here you can make any necessary updates to the activity when // the CAB is removed. By default, selected items are deselected/unchecked. } @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { // Here you can perform updates to the CAB due to // an invalidate() request return false; } }); 

La mise en page de la liste:

                 

Et dans main.xml:

   

Maintenant, si je clique longuement sur un élément de la liste, le CAB apparaît comme prévu:

taxi

J’utilise un MultiChoiceModeListener mais malheureusement les éléments de liste sélectionnés ne changent pas l’arrière-plan comme dans l’exemple ici (fond bleu clair après la sélection d’un élément):

entrer la description de l'image ici

Dois-je utiliser un sélecteur personnalisé? Ou existe-t-il une procédure standard sur la façon dont Android gère cela et je dois juste rendre mes LinearLayouts transparentes? J’ai aussi essayé ce qui suit mais sans succès:

Arrière-plan de l’élément ListView via un sélecteur personnalisé

Ce serait génial Si quelqu’un pouvait me diriger dans la bonne direction. S’il vous plaît laissez-moi savoir si vous avez besoin de plus de code d’application ou de fichiers xml.

Je n’ai jamais testé cela que dans CHOICE_MODE_SINGLE, mais dans cette situation, cela fonctionne en procédant comme suit.

  • Lorsque vous sélectionnez un élément de liste, dans le code, appelez la méthode “setItemChecked (position, checked)” (sur l’instance ListView) pour cet élément dans la liste.

  • Ajoutez ceci au XML pour les éléments ListView individuels:
    android:background="?android:attr/activatedBackgroundIndicator"

Créez simplement un dessin appelé custom_background en cours de route:

      

et définir comme arrière-plan sur la mise en page parent:

 android:background="@drawable/custom_background" 

J’essaie uniquement de prendre en charge les périphériques ICS et plus, mais cette nouvelle présentation fait ce que vous essayez de faire, en maintenant la ligne sélectionnée en surbrillance.

 adapter = new SimpleCursorAdapter(getActivity(), android.R.layout.simple_list_item_activated_1, null, from, to, 0); 

Pour quiconque rencontre encore ce problème, veuillez vérifier votre Android: minSdkVersion. S’il est trop bas, la couleur de fond du sélecteur peut ne pas fonctionner.