2013-04-03 31 views
5

Tôi đang cố gắng làm cho ứng dụng của mình hoạt động bình thường trong 2.3 (hoạt động tốt trong 4.0+) và một vấn đề tôi gặp phải là trên danh sách xem của tôi Tôi không thể nhận được nền trên mục đã chọn để thay đổi. Tôi không chắc mình cần thay đổi gì - có ai biết không?Android listview nền đã chọn không hoạt động trong 2.3

Dưới đây là listview bản thân:

<ListView 
    android:id="@+id/score_list" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_above="@+id/keyboard" 
    android:layout_below="@+id/sort_header" 
    android:choiceMode="singleChoice" 
    android:divider="#CCCCCC" 
    android:dividerHeight="1dp" 
    android:listSelector="@drawable/selector" /> 

Dưới đây là bộ chọn làm việc trong 4.0 + (trong 2.3 không có thay đổi màu sắc):

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_focused="true" android:drawable="@color/highlight"/> 
    <item android:state_pressed="true" android:drawable="@color/highlight"/> 
    <item android:state_activated="true" android:drawable="@color/highlight"/> 
    <item android:state_selected="true" android:drawable="@color/highlight"/> 
</selector> 

Tôi thực sự không cần tất cả 4 nhưng tôi muốn thử mọi thứ.

Trả lời

0

android:state_activated Được giới thiệu vào cấp độ API 11.

Xem liên kết này Drawable Resources

Cập nhật

Tôi sử dụng này trong ứng dụng của tôi (cấp API 8)

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
<!-- Selector style for listrow --> 
<item 
android:state_selected="false" 
    android:state_pressed="false" 
    android:state_focused="false" 
    android:drawable="@color/normal"/> 

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

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

<item android:state_focused="true" 
    android:state_pressed="false" 
    android:drawable="@color/highlight"/> 
</selector> 
+0

Vậy tôi có thể làm gì ở cấp API 9? Không có gì trong danh sách đó hoạt động để làm nổi bật mục đã chọn. – GrilledCheese

+0

Tôi đã cập nhật câu trả lời của mình. – AwadKab

+0

Khi tôi nhấp vào, điều này xảy ra rất nhanh: 1. Toàn bộ danh sách được đánh dấu 2. Mục tôi đã nhấp vào đèn không bật 3. Toàn bộ danh sách unhighlights Vì vậy, nó không làm nổi bật cái tôi đã nhấp.Nếu tôi nhấn và giữ, toàn bộ danh sách vẫn được tô sáng cho đến khi tôi nhả ra. – GrilledCheese

7

tôi đã có cùng một vấn đề. Tôi đã không tìm thấy một cách làm thế nào để làm điều này trong XML, nhưng tôi đã tìm thấy một workaround trong mã. Các mã sau đây được thử nghiệm trong ứng dụng có hỗ trợ mức API 7+

Trước tiên, bạn cần phải thay đổi adapter cho ListView một chút:

public class ListViewAdapter extends BaseAdapter { 
    private int selectedItemPosition = -1; 

    // your code 

    public void selectItem(int i) { 
    selectedItemPosition = i; 
    } 

    @Override 
    public View getView(int i, View view, ViewGroup viewGroup) { 

    // your code 

    if (i == selectedItemPosition) { 
     // set the desired background color 
     textView.setBackgroundColor(context.getResources().getColor(R.color.highlight)); 
    } 
    else { 
     // set the default (not selected) background color to a transparent color (or any other) 
     textView.setBackgroundColor(Color.TRANSPARENT); 
    } 
    return view; 
    } 
} 

Tiếp theo, bạn phải thông báo cho adapter rằng việc lựa chọn thay đổi trong của bạn OnItemClickListener 's onItemClickMethod:

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    // select the item 
    ((ListViewAdapter) listview.getAdapter()).selectItem(position); 
    // force redraw of the listview (invalidating just "view" is not enough) 
    ((ListView) parent).invalidateViews(); 

    // your code 
} 

Đó phải là nó. Bây giờ bất cứ khi nào bạn không thay đổi mục đã chọn, bạn có thể sử dụng cùng một mã được sử dụng trong onItemClick(), tức là. selectItem() theo sau là invalidateViews(). Thay vì gọi invalidateViews(), notifyDataSetChanged() của bộ điều hợp cũng có thể được sử dụng.

Ngoài ra, bạn cũng nên thêm danh sáchSổ thích hợp vào chế độ xem danh sách, để tránh nhấp nháy ngắn của công cụ chọn mặc định khi mục được nhấp. Tuy nhiên có một lỗi với bộ chọn danh sách trên API 7 và 8 khi nền của toàn bộ khung nhìn được thay đổi. Bạn có thể tìm cách giải quyết here

1

Cố gắng đặt thuộc tính trong chế độ xem danh sách của bạn android:cacheColorHint="@null. Nền danh sách phát sẽ không bị đèn đỏ bằng cách chạm.

+0

là một bản sửa lỗi tuyệt vời cho vấn đề của tôi. cảm ơn bạn. – j2emanue

0

Như được viết bằng phản hồi AwdKab, android:state_activated được giới thiệu ở cấp API 11. Giải pháp là triển khai giao diện Checkable cho bố cục mặt hàng danh sách trên cùng của bạn, xem my post here.

Các vấn đề liên quan