2012-04-05 13 views
9

Ho un layout con due frammenti. Il frammento della mano sinistra è un ListFragment che utilizza un SimpleCursorAdaptor, quello a destra è popolato con i dettagli sull'elemento selezionato dall'elenco nel frammento sinistro. Sto cercando di capire come assicurarsi che l'elemento selezionato da ListFragment rimanga evidenziato fino al finché non viene selezionato un altro elemento nell'elenco.Mantenimento dell'evidenziazione per l'elemento selezionato nel frammento?

Dopo alcune ricerche sono arrivato a provare a usare android:background="@drawable/item_selector" Posso cambiare i colori per i diversi stati, ma nessuno di essi sembra persistere. Ho pensato che sarebbe stato selezionato ... sembra logico che l'oggetto selezionato rimanga l'oggetto selezionato fino a quando non ne selezioni uno diverso.

Ho anche provato a utilizzare v.setSelected(true); nel mio clickhandler sperando che possa mantenere lo stato, ma non ha funzionato.

C'è uno stato che mi manca? Ho guardato attraverso la documentazione dev e nient'altro sembrato opportuno ...

item_selector.xml

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
     android:state_pressed="true" 
     android:drawable="@color/green" /> 
    <item 
     android:state_selected="true" 
     android:drawable="@color/blue" /> 
</selector> 

io non sono sicuro di cosa altro codice potrebbe aiutare, quindi sentitevi liberi di chiedere qualsiasi altra cosa potrebbe pensare necessario

+0

so che is is old, ma il selettore non ha bisogno di un elemento che non ha qualificatori nel caso in cui nessuno possa essere abbinato? – Mgamerz

risposta

12

La risposta era nella documentazione di Android dopo ulteriori ricerche (due parti della documentazione in realtà).

Innanzitutto, in modalità touch non è selezionato o messo a fuoco.

In secondo luogo, per impostazione predefinita, le visualizzazioni di elenco sono impostate su una modalità di scelta di nessuna (il che significa che nessun elemento nell'elenco può avere uno stato scelto). Tutto quello che dovevo fare era cambiare la modalità scelta (che potrebbe essere singola o multipla, ho solo bisogno/voluto singolo) con l'aggiunta di questo:

getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 

Poi ho usato lo stato scelta nel mio selettore XML (traduce al activated stato):

<item 
android:state_activated="true" 
android:drawable="@color/blue" /> 

applicare tale nel file XML di layout riga come sfondo:

<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1" 
    android:layout_width="match_parent" 
    android:layout_height="35dp" 
    android:background="@drawable/item_selector" 
    android:gravity="center_vertical"/> 

il mio articolo scelto ora appare con uno sfondo blu fino a un elemento diverso i s scelto.

Si noti che questo (android: state_activated) richiede Android API 11 o versioni successive.

+2

android: ha bisogno di stato attivato almeno livello API 11 – eftokay83

+3

non funziona per me. – Shine

+0

ha funzionato per me !! –

1

Credo che sia necessario aggiungere state_focused anche per farlo sembrare selezionato o evidenziato.

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
     android:state_pressed="true" 
     android:drawable="@color/green" /> 
    <item 
     android:state_selected="true" 
     android:drawable="@color/blue" /> 

    <item 
     android:state_focused="true" 
     android:drawable="@color/red" /> 
</selector> 
+1

Grazie per il suggerimento. Ho fatto un tentativo, ma ancora senza fortuna. :( – Barak

0

Questo ha funzionato molto bene per me nello ListFragment, ma penso che funzioni solo per Android 4.0 e versioni successive. Ho creato un layout semplice per la voce di elenco con android:background="?android:attr/activatedBackgroundIndicator (nel caso di Android inferiore a 4.0 è necessario ceate quello simile in drawable):

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="?android:attr/listPreferredItemHeight" 
android:gravity="center_vertical" 
android:background="?android:attr/activatedBackgroundIndicator" 
android:orientation="horizontal" > 

<TextView 
    android:id="@+id/list_item_text" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:ellipsize="end" 
    android:singleLine="true" 
    android:textAppearance="?android:attr/textAppearanceListItemSmall" 
    android:gravity="center_vertical" 
    android:layout_margin="@dimen/double_view_margin" /> 

E poi, basta creare un semplice ArrayAdapter utilizzando questo layout e impostare la modalità scelta per singolo:

final ArrayAdapter<String> labelsAdapter = new ArrayAdapter<String>(getActivity(), R.layout.item_simple_list_item, R.id.list_item_text, labels); 

setListAdapter(labelsAdapter); 

getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 

Dopo che puoi evidenziare l'articolo necessario con il metodo setItemChecked:

@Override 
public void onListItemClick(final ListView l, final View v, final int position, final long id) { 
    getListView().setItemChecked(position, true); 
} 
Problemi correlati