2011-12-19 17 views
9

Wiem, że Android nie podświetla niczego w trybie TouchMode. Ale robię coś podobnego do aplikacji Gmaila, w której zaznaczasz rzeczy po lewej stronie i pokazujesz szczegóły po prawej stronie działania (zastanawiasz się, jak Google to zrobił).Jak wyróżnić wybrany element w ListView?

Więc muszę opowiedzieć, co zostało zaznaczone po lewej stronie ListView. Znalazłem kilka podobnych pytań i rozwiązania są zasadniczo:

1.override metody getView adaptera i setBackground dla wybranych pozycji

2.setBackground widoku onItemClick i wyczyścić go dla pylników wyboru

Ale żaden z nich nie pracował dla mnie ze względu na dziwne zachowanie: Gdy klikam na jeden element i podświetlam go, piąta pozycja po nim jest również podświetlona i tak dalej, jak przewijam listę.

Wszelkie sugestie? DZIĘKI!

Odpowiedz

21

Użyj listView.setChoiceMode (int choiceMode);

Parametry

choiceMode Jednym CHOICE_MODE_NONE, CHOICE_MODE_SINGLE lub CHOICE_MODE_MULTIPLE z klasy android.widget.AbsListView

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

Trzeba także dodać MultiChoiceModeListener można mieć CHOICE_MODE_SINGLE

(android.widget.AbsListView.MultiChoiceModeListener)

Zobacz próbka poniżej

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

+0

to coś robi? Próbowałem, ale selektor nie pozostanie jednak .. – Han

+0

dodał więcej wyjaśnień –

+0

Wielkie dzięki! Dodając MultiChoiceModeListener i ustawiając tło adaptera w pliku xml, zadziałało! Zastanawiam się jednak, dlaczego Android przyjmuje kolor tła tylko wtedy, gdy element został wybrany ... również automagicznie – Han

1

Powodem, dla którego podświetlasz wiele elementów, jest prawdopodobnie: ponowne użycie całego widoku lub ustawienie tła obu tych widoków na tę samą instancję do rysowania. Jeśli masz dwa razy takie same rysunki na ekranie, wszystkie zdarzenia, które wystąpią w pierwszej kolejności, zdarzą się wszystkim innym, ponieważ ta logika jest zaimplementowana w instancji samego Szuflady.

Aby rozwiązać ten problem, albo: nie ponownego użytku widoki dla wielu wierszy lub nie re-use kanału alfa dla wielu wierszy (utwórz nowy za każdym razem)

Wiem, brzmi to dużych nakładów i jest, ale jeśli nie masz lepszego rozwiązania, to jest najłatwiejsza.

+0

dzięki stary .. jestem teraz próbuje zobaczyć, gdzie kod ponownie wykorzystuje pogląd, ponieważ nie napisał. BTW, czy selektor może pozostać na szczycie jako podświetlenie zamiast zmieniać tło? Ma to więcej sensu, jeśli jest to wykonalne. – Han

0

Ponieważ elementy w listviews naśladuje te na górze, że naśladuje także tła z nich. Musisz ustawić każdy z tła swoich przedmiotów w funkcji getView(). W każdym elemencie w getView() musisz ustawić tło dla wybranych i niewybranych.

16

to dla niestandardowego listactivity lub ListFragment

kulminacyjnym wybrany element w 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

//// @ odkształcalne/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> 

//////// //////////// i 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 Przedmiot

<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

wykorzystanie tego jako selektor listy:

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

i to 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> 

wybrać preferowany kolor podświetlenia

Powiązane problemy