2012-10-05 5 views
11

Nella mia applicazione voglio fare qualcosa di simile all'app gmail sui tablet, nella sinistra per avere l'elenco degli elementi e nel diritto di avere un frammento con contenuto di quell'elemento, come per l'app Gmail, questo contenuto viene scaricato dopo la selezione. Dopo aver fatto clic su un elemento, desidero che rimanga evidenziato finché, ovviamente, cambio la selezione. Ho raggiunto un punto in cui funziona, ma solo se clicco due volte sullo stesso elemento, quindi prima clicco, la selezione funziona e quindi l'elemento torna al suo stato 'predefinito' e se faccio di nuovo clic su di esso, il selettore (per stato selezionato) è visibile.Android: imposta l'elenco visualizza l'elemento come "selezionato" (evidenziato)

Questo è quello che ho finora:

1) Il selettore (listitem_background.xml)

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

    <item android:drawable="@drawable/solid_white" android:state_pressed="false" android:state_selected="false"/> 
    <item android:drawable="@drawable/listitem_pressed" android:state_pressed="true"/> 
    <item android:drawable="@drawable/listitem_focused" android:state_selected="true"/> 

</selector> 

2) Per la disposizione lineare superiore dell'elemento elenco:

android:background="@drawable/listitem_background" 

(Ho provato a impostare questo come listelector, pure)

3) Questo è il ListView:

<ListView 
    android:id="@+id/my_list_view" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:choiceMode="singleChoice" 
    android:dividerHeight="1dp" 
    android:drawSelectorOnTop="true" 
    android:fadeScrollbars="true" 
    android:fastScrollEnabled="true" 
    android:focusable="true" 
    android:focusableInTouchMode="true" 
    android:scrollbarFadeDuration="100" 
    android:scrollbars="vertical" /> 

4) Nella parte di codice ho provato a giocare con questo:

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    view.setSelected(true); 
    ... 
} 

[EDIT] In effetti ho notato che la selezione è perso dopo il commit del frammento a destra lato dello schermo. Se non commetto il frammento che funziona come un fascino ... Penso di aver bisogno qualcosa di simile nel selettore:

<item android:drawable="@drawable/listitem_focused" android:state_activated="true" android:state_focused="false"/> 

Ma, ovviamente, non questo ...

risposta

45

OK, finalmente la mia risposta.

L'idea è quella di utilizzare il state_activated nel selettore e

listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE) 

nel codice, o

android:choiceMode="singleChoice" 

nel XML, naturalmente

questo modo il selettore dovrebbe aspetto:

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

    <item android:drawable="@drawable/solid_white" android:state_activated="false"/> 
    <item android:drawable="@drawable/solid_white" android:state_activated="false" android:state_pressed="false"/> 
    <item android:drawable="@drawable/listitem_pressed" android:state_pressed="true"/> 
    <item android:drawable="@drawable/listitem_focused" android:state_activated="true"/> 

</selector> 

Questo è come la lista dei layout di voce deve essere:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:background="@drawable/listitem_background" 
    android:orientation="vertical" > 
... 
<LinearLayout/> 
+0

grazie. questo ha funzionato per me :) –

+0

non funziona per api 8 –

4

Ho affrontato lo stesso problema e poi ho solo bisogno di un semplice linea a mio avviso elemento XML.

android:background="?android:attr/activatedBackgroundIndicator"

This post potrebbe aiutare

+0

Solo per livello API> = 14 – johntheripp3r

Problemi correlati