web-dev-qa-db-fra.com

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

J'ai récemment commencé à utiliser Android barres d'action et barres d'actions contextuelles (CAB).

J'ai juste une activité qui est une ListActivity. Fondamentalement, j'utilise le code suivant coupé 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 présentation de la liste:

<ImageView
    Android:id="@+id/message_on_clipboard_icon"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_gravity="center_vertical"
    Android:minWidth="30dp"
    Android:padding="7sp"
    Android:src="@Android:drawable/presence_online" >
</ImageView>

<LinearLayout
    Android:id="@+id/linearLayout2"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:background="@drawable/listitem_background"
    Android:orientation="vertical" >

    <TextView
        Android:id="@+id/message"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_marginRight="5sp"
        Android:fadingEdge="horizontal"
        Android:singleLine="true"
        Android:text="TextView"
        Android:textAppearance="?android:attr/textAppearanceLarge" >
    </TextView>

    <LinearLayout
        Android:id="@+id/linearLayout1"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:background="@drawable/listitem_background"
        Android:orientation="horizontal" >

        <TextView
            Android:id="@+id/message_length"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_marginRight="5sp"
            Android:text="@string/message_length"
            Android:textAppearance="?android:attr/textAppearanceSmall" >
        </TextView>

        <TextView
            Android:id="@+id/message_count"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_marginRight="5sp"
            Android:text="TextView"
            Android:textAppearance="?android:attr/textAppearanceSmall" >
        </TextView>

        <TextView
            Android:id="@+id/date_label"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_marginRight="5sp"
            Android:text="@string/date_label" >
        </TextView>

        <TextView
            Android:id="@+id/date_message"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="TextView" >
        </TextView>
    </LinearLayout>
</LinearLayout>

Et dans main.xml:

<ListView
    Android:id="@+Android:id/list"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
>
</ListView>

Maintenant, si je clique longuement sur un élément de la liste, le CAB s'affiche comme prévu:

cab

J'utilise un MultiChoiceModeListener mais malheureusement les éléments de la 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):

enter image description here

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 j'ai juste besoin de rendre mes LinearLayouts transparents? J'ai également essayé ce qui suit mais sans succès:

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

Ce serait formidable si quelqu'un pouvait m'orienter dans la bonne direction. Veuillez me faire savoir si vous avez besoin de plus de code d'application ou de fichiers xml.

41
domi

Je n'ai jamais testé cela 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, vérifié)" (sur l'instance ListView) pour cet élément de la liste.

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

52
Alexander Lucas

Créez simplement un arrière-plan personnalisé appelé en cours de route:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:drawable="@color/highlight" Android:state_activated="true"/>
    <item Android:drawable="@color/normal"/>
</selector>

et définissez comme arrière-plan sur votre mise en page parent:

Android:background="@drawable/custom_background"
12
Juan M. Rivero

Essayant uniquement de prendre en charge les appareils ICS et plus), mais cette nouvelle disposition fait ce que vous essayez d'atteindre, en gardant la ligne sélectionnée en surbrillance.

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

Pour tous ceux qui rencontrent toujours ce problème, veuillez vérifier votre Android: minSdkVersion. S'il est trop bas, la couleur d'arrière-plan du sélecteur peut ne pas fonctionner.

0
pengguang001