2011-02-10 16 views
9

Mam ListView z niestandardowym układem dla jego elementów i trzeba określić osobny kolor tła dla zaznaczonych elementów za pomocą selektora. Oto selektor dla nieparzystych elementów:Potrzebujesz pomocy z selektorem kolorów dla zaznaczonej listy Wyświetl elementy

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

i tu jest selektor nawet dla przedmiotów:

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

element ListView szablon wygląda tak:

<?xml version="1.0" encoding="utf-8"?> 
<com.androidhub.core.CheckableLinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" android:layout_height="40dip"> 
    <TextView 
     android:text="TextView" 
     android:id="@+id/textView1" 
     android:layout_height="fill_parent" 
     android:layout_width="wrap_content" 
     android:gravity="center_vertical" 
     android:textColor="@color/list_item"></TextView> 
</com.androidhub.core.CheckableLinearLayout> 

Element główny element listy jest CheckableLinearLayout: http://paste.org/pastebin/view/28711

ListView ma jeden Tryb wyboru (próbowałem również tryb wielokrotnego wyboru, ale to też nie działa dla mnie)

public class MainActivity extends ListActivity { 

    List<String> items = new ArrayList<String>(); 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     items.add("test 1"); 
     items.add("test 2"); 
     items.add("test 3"); 
     items.add("test 4"); 
     getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
     getListView().setAdapter(new TestAdapter(this, items)); 
     getListView().setBackgroundColor(getResources(). 
      getColor(android.R.color.white)); 
    } 
} 

adapter do tego ListView nazywam setChecked() metody CheckableLinearLayout ale to nie zmienia swój kolor:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater inflater = LayoutInflater.from(getContext()); 
    View v = convertView; 
    if(v == null) { 
     v = inflater.inflate(R.layout.list_item, null); 
    } 

    if(position % 2 != 0) { 
     v.setBackgroundResource(R.drawable.list_item_even); 
    } 
    else { 
     v.setBackgroundResource(R.drawable.list_item_odd); 
    } 

    if(parent instanceof ListView) { 
     ListView lv = (ListView)parent; 
     if(v instanceof CheckableLinearLayout) { 
      CheckableLinearLayout cll = (CheckableLinearLayout)v; 
      cll.setChecked(lv.isItemChecked(position)); 
     } 
    } 

    return v; 
} 

Co robię źle? Widzę, że pozycja state_pressed z selektora działa dobrze, ale nie sprawdza stanu_patterned. Co będzie właściwym podejściem do ustawienia state_checked tła z XML, a nie z kodu?

+0

Chyba masz problem z kartą. Do takich rzeczy powinieneś rozszerzyć 'BaseExpandableListAdapter'. W obrębie tej klasy można zastąpić metody 'getGroupView' i' getChildView' oraz ustawić odpowiedni kolor/rozmiar/kształt/etc. Sprawdź [to pytanie] (http://stackoverflow.com/questions/3627096/android-expandablelistviews-and-checkboxes/), gdzie zamieściłem przykładową implementację adaptera. – rekaszeru

+0

Dzięki za komentarz, ale najważniejsze, co staram się tutaj osiągnąć, to ustawienie koloru tła w XML, a nie w kodzie. Udało mi się zaimplementować to w kodzie, ale gdy zmieniam styl mojej aplikacji, muszę zmienić także kod. Jest to dość niewygodne. –

+0

Zobacz to pytanie http://stackoverflow.com/questions/3742979/how-to-get-a-roidroid-listview-item-selector-to-use-state-checked – basicsharp

Odpowiedz

0

Spróbuj realizacji getListView() setOnItemClickListener tak:.

OnItemClickListener listener = new OnItemClickListener() { 

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

     CheckableLinearLayout r; 
     for(int i = 0; i< lv.getChildCount(); i++) { 
      r= (CheckableLinearLayout)lv.getChildAt(i); 
      if(i==position) 
       r.setChecked(true); 
      else 
       r.setChecked(false); 
     } 

    } 
}; 
0

Czy próbowałeś tworzenia XML trzymać ListView podobny do tego? Wokół tagu @ + id/android: list jest trochę czarodziejstwa.

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:orientation="vertical" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:background="@drawable/megaphone_320x480"> 
     <ListView 
       android:id="@+id/android:list" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:background="@drawable/megaphone_320x480" 
       android:cacheColorHint="@drawable/transparent" 
       /> 
     <TextView 
       android:id="@id/android:empty" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:textColor="@drawable/red" 
       android:gravity="center_vertical|center_horizontal" 
       android:textStyle="bold" 
       android:text="@string/error_no_groups" 
       /> 
</LinearLayout> 
2

myślę szukasz tego atrybutu:

android:duplicateParentState="true" 

spróbuj dodać go do tagu CheckableLinearLayout w układzie komórkowym.

Kluczowe naciśnięcie/zwolnienie jest jedynym zdarzeniem propagowanym do widoków podrzędnych grupy ViewGroup, więc każdy widok będzie zarządzał własnym stanem, chyba że wyraźnie powiesz, aby używał jego rodziców.

Również po tej zmianie myślę, że można po prostu usunąć cały blok kodu, który powoduje, że CheckableLinearLayout być sprawdzone:

if(parent instanceof ListView)... 
Powiązane problemy