Android : Evidenziare elemento selezionato in ListView

? Velja @ | Original: StackOverFlow
---

Sto facendo un programma che funziona con ListViews in Android, e non riesco a fare in modo che la ( chacked ) elemento selezionato ha uno sfondo diverso . Sto utilizzando CHOICE_MODE_SINGLE . Ecco come il mio codice è finora :

Il ListView che uso : (all'interno layout.xml )

<ListView
    android:id="@+id/listView"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:choiceMode="singleChoice"
    android:listSelector="@drawable/selector_test" >
</ListView>

Il layout TextView che uso l'adattatore : ( listItem.xml )

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/listItem"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textSize="23sp"
    android:textStyle="bold" />

Questo è dove aggiungo l'adattatore :

mListAdapter = new ArrayAdapter<String>(this, R.layout.listItem, mList);
mListView = (ListView) findViewById(R.id.listView);
mListView.setAdapter(mAuthorAdapter);
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
        String selected = mList.get(position);
        // ...
        mListView.setItemChecked(position, true);
    }
});

Sono sicuro che l' elemento corretto è selezionata al clic, perché quando io chiamo getCheckedItemPosition ( ), che restituisce il valore corretto .

E ora, le due cose che ho provato per evidenziare la voce selezionata :

Selettore drawable : ( selector_test.xml )

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" android:enterFadeDuration="@android:integer/config_longAnimTime">

    <item android:state_checked="true"><shape>
            <solid android:color="@color/red" />
        </shape></item>
    <item android:state_selected="true"><shape>
            <solid android:color="@color/blue" />
        </shape></item>
    <item android:state_pressed="true"><shape>
            <solid android:color="@color/green" />
        </shape></item>

</selector>

Aggiungo che in .xml con :

android:listSelector="@drawable/selector_test"

Background drawable : ( background_test.xml )

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

    <item android:drawable="@color/red" android:state_checked="true"/>
    <item android:drawable="@color/blue" android:state_selected="true"/>
    <item android:drawable="@color/green"/>

</selector>

Aggiungo che in .xml con :

android:background="@drawable/background_test"

Ho provato ad aggiungere il selettore e lo sfondo sia listView.xml e listItem.xml, ma l' unica cosa che cambia è il colore di sfondo di default, e il colore del selettore quando si preme l'elemento ( o tenuto ) . Android : state_checked = "true" e Android : state_selected = "true" sembra non fare nulla . Posso cambiare lo sfondo sovrascrivendo il metodo GetView ( ) in ArrayAdapter e invocando setBackgroundColor ( ) in esso se è selezionata la vista, e lo fa cambiare lo sfondo, ma anche si sbarazza del selettore del tutto . Inoltre, non piace molto per sovrascrivere classi solo cambiare una riga di codice, specialmente se la stessa cosa può essere realizzato in modo diverso . Quindi quello che sto chiedendo è: esiste un modo per evidenziare elemento selezionato in ListView aggiungendo un selettore o sfondo disegnabile ad esso, e sto solo facendo male, o dovrò farlo funzionare qualche altro modo . Grazie in anticipo! :)

---

Top 5 Risposta

1Ravinder Bhandari @

aggiungere questa linea in onStart della vostra attività

lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

dove lv è istanza di listView

quindi ignorare questo metodo e aggiungere le seguenti righe ad essa .

 @Override
public void onListItemClick(ListView l, View v, int position, long id) {


    // Set the item as checked to be highlighted 
    lv.setItemChecked(position, true);
            v.setBackgroundColor(Color.BLUE);

        conversationAdapter.notifyDataSetChanged();

}

e poi cambiare il colore di sfondo precedente dell'elemento selezionato torna alla normalità in modo GetView della scheda personalizzata

2Jack Duong @

Try this:

listViewDay.setItemChecked(position, true);
listViewDay.setSelection(position);

listitem.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="40dp"
    android:background="@drawable/list_day_selector" >

    <TextView
        android:id="@+id/txtItemDay"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:gravity="center_vertical|center_horizontal"
        android:text="22"
        android:textColor="@android:color/white"
        android:textSize="22sp" />

</LinearLayout>

list_selector.xml

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

    <item android:drawable="@drawable/list_item_bg_normal" android:state_activated="false"/>
    <item android:drawable="@drawable/bg_with_left_arrow" android:state_pressed="true"/>
    <item android:drawable="@drawable/bg_with_left_arrow" android:state_activated="true"/>

</selector>
3Rafael Ruiz Tabares @

Penso cann't utilizzare mListView dentro classe anonima . È necessario utilizzare AdapterView arg0

mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View view,
                int position, long id) {
            AnyObject obj=(AnyObject)arg0.getItemAtPosition(position);

                            ........
                            .........
                            .........

        }
    });