2011-02-10 78 views
9

我有一個帶有自定義佈局的ListView,需要使用選擇器指定選中項目的單獨背景顏色。 這裏是奇品選擇:爲選中的ListView項目需要顏色選擇器幫助

<?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> 

,這裏是偶數項選擇:

<?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> 

ListView項模板看起來是這樣的:

<?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> 

列表項的根元素是CheckableLinearLayout:http://paste.org/pastebin/view/28711

ListView has single選擇模式(我也嘗試過多種選擇模式,但它也沒有爲我工作)

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)); 
    } 
} 

在適配器本的ListView我叫setChecked()方法CheckableLinearLayout的,但它不會改變其顏色:

@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; 
} 

我在做什麼錯了?我可以看到state_pressed項目從選擇器工作正常,但state_checked不。 什麼是正確的方法來設置state_checked從XML背景,而不是從代碼?

+0

我猜你的問題是與你的適配器。對於這樣的事情,你應該擴展`BaseExpandableListAdapter`。在這個類中你可以覆蓋`getGroupView`和`getChildView`方法,並設置合適的顏色/大小/形狀等。看看[這個問題](http://stackoverflow.com/questions/3627096/android-expandablelistviews-and-checkboxes/),我也發佈了一個示例適配器實現。 – rekaszeru 2011-04-12 08:59:51

回答

0

嘗試實施getListView()setOnItemClickListener這樣的:

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

您是否嘗試過創建XML持有類似這樣你的ListView?圍繞@ + id/android:list標籤有一些魔力。

<?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

我認爲你正在尋找這個屬性:

android:duplicateParentState="true" 

嘗試將其添加到您的CheckableLinearLayout標籤在你的佈局。

按鍵/釋放是傳播到ViewGroup的子視圖的唯一事件,因此每個視圖都會管理它自己的狀態,除非您明確告訴它使用它的父項。

而且,這種變化之後,我認爲你可以刪除整個代碼塊,迫使CheckableLinearLayout進行檢查:

if(parent instanceof ListView)...