2011-02-10 25 views
9

Tôi có một ListView với bố cục tùy chỉnh cho các mục của nó và cần chỉ định màu nền riêng cho các mục đã chọn bằng bộ chọn. Dưới đây là chọn cho các hạng mục lẻ:Cần trợ giúp với bộ chọn màu cho danh sách được chọnXem các mục

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

và ở đây là chọn cho các hạng mục còn:

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

mục ListView mẫu trông như thế này:

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

Yếu tố gốc của mục danh sách là CheckableLinearLayout: http://paste.org/pastebin/view/28711

ListView có duy nhất chế độ lựa chọn (Tôi cũng đã cố gắng nhiều chế độ lựa chọn nhưng nó cũng không làm việc cho tôi)

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

Trong bộ chuyển đổi cho ListView này tôi gọi setChecked() phương pháp CheckableLinearLayout nhưng nó không thay đổi màu sắc của nó:

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

Tôi đang làm gì sai? Tôi có thể thấy rằng state_pressed mục từ bộ chọn hoạt động tốt nhưng state_checked thì không. Cách tiếp cận đúng để thiết lập state_checked nền từ XML, không phải từ mã?

+0

Tôi đoán vấn đề của bạn là với Adaptor của bạn. Đối với những thứ như vậy bạn nên mở rộng 'BaseExpandableListAdapter'. Trong lớp đó, bạn có thể ghi đè lên phương thức 'getGroupView' và' getChildView' và thiết lập màu/kích thước/hình dạng/etc thích hợp. Hãy xem [câu hỏi này] (http://stackoverflow.com/questions/3627096/android-expandablelistviews-and-checkboxes/), tại đây tôi cũng đã đăng bản triển khai bộ điều hợp mẫu. – rekaszeru

+0

Cảm ơn nhận xét của bạn nhưng điều chính mà tôi đang cố gắng đạt được ở đây là thiết lập màu nền trong XML, không phải trong mã. Tôi quản lý làm thế nào để thực hiện điều này trong mã nhưng khi tôi thay đổi phong cách giao diện người dùng của ứng dụng của tôi, tôi cần phải thay đổi mã cũng. Điều này khá bất tiện. –

+0

Xem câu hỏi này http://stackoverflow.com/questions/3742979/how-to-get-a-android-listview-item-selector-to-use-state-checked – basicsharp

Trả lời

0

Hãy thử thực hiện getListView() setOnItemClickListener như thế này:.

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

Bạn đã cố gắng tạo ra một XML để giữ ListView của bạn tương tự như này? Có một số thuật sĩ xung quanh thẻ @ + 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

Tôi nghĩ rằng bạn đang tìm kiếm cho thuộc tính này:

android:duplicateParentState="true" 

Hãy thử thêm nó vào thẻ CheckableLinearLayout của bạn trong cách bố trí di động của bạn.

Báo chí/phát hành chính là sự kiện duy nhất được truyền đến chế độ xem con của ViewGroup, vì vậy, mỗi chế độ xem sẽ quản lý trạng thái riêng của nó trừ khi bạn nói rõ ràng để sử dụng bố cục đó.

Ngoài ra, sau khi thay đổi này, tôi nghĩ rằng bạn chỉ có thể loại bỏ toàn bộ khối mã đó buộc CheckableLinearLayout để được kiểm tra:

if(parent instanceof ListView)... 
Các vấn đề liên quan