2011-12-19 18 views
9

So che Android non evidenzia alcunché in TouchMode. Ma sto facendo qualcosa di simile all'applicazione gmail in cui selezioni materiale dal lato sinistro e mostri i dettagli sul lato destro dell'attività (chiediti come ha fatto Google).Come evidenziare la voce selezionata in ListView?

Quindi la storia è che devo evidenziare ciò che è stato selezionato sul lato sinistro di ListView. Ho trovato alcune domande simili e le soluzioni sono fondamentalmente:

1.override metodo GetView dell'adattatore e setBackground per la posizione

2.setBackground selezionata del onItemClick visualizzare e cancellare per corrispondenza con un altro selezione

Ma nessuno di loro ha funzionato per me a causa di un comportamento strano: quando clicco su un oggetto e lo evidenzio, anche il quinto elemento dopo questo viene evidenziato, e così via, mentre scorro l'elenco.

Qualche suggerimento? GRAZIE!

risposta

21

Utilizzare listView.setChoiceMode (int choiceMode);

Parametri

choiceMode Uno dei CHOICE_MODE_NONE, CHOICE_MODE_SINGLE o CHOICE_MODE_MULTIPLE dalla classe android.widget.AbsListView

http://developer.android.com/reference/android/widget/AbsListView.html#setChoiceMode(int)

È inoltre necessario aggiungere MultiChoiceModeListener, si può avere CHOICE_MODE_SINGLE

(android.widget.AbsListView.MultiChoiceModeListener)

Fare riferimento a l'esempio riportato di seguito

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List16.html

+0

fa qualcosa? Ho provato ma il selettore non rimane però .. – Han

+0

aggiunto più spiegazioni –

+0

Grazie mille! Aggiungendo un MultiChoiceModeListener e impostando lo sfondo dell'adattatore nel file xml ha funzionato! Ma mi chiedo perché Android acquisisca il colore di sfondo solo quando l'oggetto è stato selezionato ... in modo automatico – Han

1

Il motivo per cui si evidenziano più elementi è probabilmente dovuto al fatto che si sia: riutilizzando l'intera vista o impostando lo sfondo di entrambe queste viste sulla stessa istanza Drawable. Se si ha lo stesso drawable sullo schermo due volte, tutti gli eventi che succedono al primo succederanno a tutti gli altri, poiché tale logica è implementata nell'istanza del Drawable stesso.

Per risolvere questo problema, sia: non Riutilizzo Visualizzazioni per più righe, o non riutilizzo drawable per più righe (creare uno nuovo ogni volta)

So che questo suona alta intensità di risorse e è, ma a meno che tu non abbia una soluzione migliore, questa è la soluzione più semplice.

+0

grazie uomo .. ora sto cercando di vedere dove il codice riutilizza la vista, dato che non ho scritto io. A proposito, è possibile lasciare in primo piano il selettore come evidenziare invece di cambiare lo sfondo? Ha più senso se è fattibile. – Han

0

Perché gli elementi nelle listviews imita quelli in alto, si imita anche lo sfondo di loro. È necessario impostare tutti gli elementi dello sfondo degli elementi nella funzione getView(). In ogni oggetto di getView() devi impostare lo sfondo sia per quelli selezionati che per quelli non selezionati.

16

questo è per ListActivity personalizzato o ListFragment

clou elemento selezionato in ListView

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long arg3) 
{ 

    for(int a = 0; a < parent.getChildCount(); a++) 
    { 
     parent.getChildAt(a).setBackgroundColor(Color.TRANSPARENT); 
    } 

    view.setBackgroundColor(Color.GREEN); 
} 
2

//// @ drawable/list_selector

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

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

<item android:drawable="@drawable/list_item_touch" 
android:state_pressed="true"/> 

<item android:drawable="@drawable/list_item_touch" 
android:state_pressed="false" android:state_selected="true"/> 

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

</selector> 

//////// //////////// e su ListView

<ListView 
    android:id="@+id/list_slidermenu" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    android:choiceMode="singleChoice" 
    android:dividerHeight="1dp" 
    android:listSelector="@drawable/list_selector" 
    android:background="@color/list_background" 
    android:divider="#060606"/> 

/////////////////////// ListView Articolo

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@drawable/list_selector"> 

    <ImageView 
    android:id="@+id/icon" 
    android:layout_width="35dp" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_marginLeft="12dp" 
    android:layout_marginRight="12dp" 
    android:contentDescription="@string/desc_list_item_icon" 
    android:src="@drawable/ic_home" 
    android:layout_centerVertical="true" /> 

    </RelativeLayout> 
0

utilizzare questo come selettore di lista:

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

e questo list_bg :

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
    <solid android:color="@color/list_bg_color" /> 
</shape> 

scegliere il colore di evidenziazione preferito

Problemi correlati