2010-10-24 35 views
5

Tôi đang làm việc trên một ListActivity sẽ hiển thị một loạt các số (trọng số). Tôi muốn thay đổi nền của một hàng cụ thể trong ListView. Để làm điều này, tôi đã tạo ra một triển khai tùy chỉnh của lớp ArrayAdapter và đã ghi đè phương thức getView. Bộ điều hợp chấp nhận danh sách các số và đặt nền của hàng có số từ 20 đến màu vàng (vì lý do đơn giản).Custom ArrayAdapter setBackground trong getView

public class WeightListAdapter extends ArrayAdapter<Integer> { 

    private List<Integer> mWeights; 

    public WeightListAdapter(Context context, List<Integer> objects) { 
     super(context, android.R.layout.simple_list_item_1, objects); 

     mWeights = objects; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View v = super.getView(position, convertView, parent); 

     int itemWeight = mWeights.get(position); 
     if (itemWeight == 20) { 
      v.setBackgroundColor(Color.YELLOW); 
     } 
     return v; 
    } 

} 

Vấn đề là không chỉ hàng có số 20 là nền màu vàng mà còn là hàng có số 0 (hàng đầu tiên) và tôi không chắc tại sao lại như vậy.

Tôi có làm gì sai trong phương thức getView (như gọi phương thức siêu) không? Lý do của tôi cho việc thực hiện là: Tất cả các khung nhìn trả về phải giống nhau (đó là lý do tại sao tôi gọi phương thức siêu) chỉ khung nhìn phù hợp nếu tiêu chí cần được thay đổi.

Cảm ơn sự giúp đỡ của bạn!

Trả lời

3

Tôi đã làm một ít nghiên cứu để tìm hiểu cách thực hiện điều này đúng cách.

Tôi đang viết thư này cho những người khác có cùng vấn đề, vì tôi đoán đây là cách thích hợp để thực hiện. Xin vui lòng, cho tôi biết, nếu tôi bị nhầm lẫn hoặc nếu giải pháp này có bất kỳ sai sót nào tôi không thấy.

public class WeightListAdapter extends ArrayAdapter<Integer> { 

    private static final int TYPE_COUNT = 2; 
    private static final int TYPE_ITEM_COLORED = 1; 
    private static final int TYPE_ITEM_NORMAL = 0; 

    public WeightListAdapter(Context context, List<Integer> objects) { 
    super(context, android.R.layout.simple_list_item_1, objects); 
    } 

    @Override 
    public int getViewTypeCount() { 
    return TYPE_COUNT; 
    } 

    @Override 
    public int getItemViewType(int position) { 
    int item = getItem(position); 

    return (item == 30) ? TYPE_ITEM_COLORED : TYPE_ITEM_NORMAL; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
    View v = super.getView(position, convertView, parent); 
    switch (getItemViewType(position)) { 
    case TYPE_ITEM_COLORED: 
     v.setBackgroundColor(Color.YELLOW); 
     break; 
    case TYPE_ITEM_NORMAL: 
     break; 
    } 

    return v; 

    } 
} 

Rõ ràng lớp cơ sở đã thực hiện logic đảm bảo đúng convertView được truyền cho getView phương pháp (dựa trên getViewItemTypegetViewTypeCount phương pháp).

1

Chế độ xem của Android đang sử dụng lại thành phần cho mỗi hàng. Tôi cũng gặp vấn đề này.

+0

Tôi hiểu. Điều này sẽ có ý nghĩa, vâng. Vì vậy, câu hỏi bây giờ là cách tốt nhất để giải quyết vấn đề này là gì. Bỏ qua convertView hoặc thiết lập các thuộc tính kiểu cho cả hai, nếu kết thúc khác, các tùy chọn? – Igor

1

Nếu đó là do tái sử dụng, tại sao bạn không thêm một kiểm tra khác nếu itemWeight không bằng 20? Nếu không bằng nhau, sau đó đặt nền trở lại bình thường.

+0

Vâng, tôi đã nghĩ về điều đó, nhưng tôi đã làm một ít nghiên cứu và tìm ra một giải pháp khác. – Igor

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