5

Tôi đã tạo triển khai bộ điều hợp tùy chỉnh. Tôi cũng có một vài loại chế độ xem khác nhau trong bộ điều hợp này.Cập nhật động các loại chế độ xem ListView

Tôi cần phải thay thế một số chế độ xem bộ điều hợp của mình khi chạy. Romain Guy nói rằng "... thay đổi số lượng loại xem động là một sai lầm lớn" (xem ArrayAdapter and ListView - ArrayIndexOutOfBoundsException). Cách chính xác để làm điều này khi số lượng loại xem thay đổi động là gì?

AdapterCode:

... 
private List<Class<?>> itemTypes = new ArrayList<Class<?>>(20); 

private void initList(List<Object> items) { 
    itemTypes = new ArrayList<Class<?>>(20); 
    positionSection = new SparseArray<Integer>(items.size()); 

    int count = 0; 
    int sectionIndex = -1; 
    for (Object object : items) { 
     Class<?> currentClass = object.getClass(); 
     if (object instanceof String) { 
      sectionIndex = count; 
     } 
     if (!itemTypes.contains(currentClass)) { 
      itemTypes.add(currentClass); 
     } 
     positionSection.put(count, sectionIndex); 
     count++; 
    } 
} 
@Override 
public int getItemViewType(int position) { 
    return itemTypes.indexOf(items.get(position).getClass()); 
} 

@Override 
public int getViewTypeCount() { 
    int size = itemTypes.size(); 
    return size == 0 ? 1 : size; 
} 

@Override 
public void notifyDataSetChanged() { 
    initList(items); 
    super.notifyDataSetChanged(); 
} 
... 

tôi cập nhật danh sách loại mục của tôi sau khi tôi đã thay đổi dữ liệu của tôi, nhưng nó không hoạt động như dự kiến.

Kết quả mã trên trong một ngoại lệ ArrayIndexOutOfBounds:

10-21 20:18:16.231: E/AndroidRuntime(4475): java.lang.ArrayIndexOutOfBoundsException: length=3; index=3 
10-21 20:18:16.231: E/AndroidRuntime(4475):  at android.widget.AbsListView$RecycleBin.addScrapView(AbsListView.java:6437) 
10-21 20:18:16.231: E/AndroidRuntime(4475):  at android.widget.ListView.layoutChildren(ListView.java:1559) 
10-21 20:18:16.231: E/AndroidRuntime(4475):  at android.widget.AbsListView.onLayout(AbsListView.java:2102) 
10-21 20:18:16.231: E/AndroidRuntime(4475):  at se.davison.sodatools.widget.SectionListView.onLayout(SectionListView.java:147) 
10-21 20:18:16.231: E/AndroidRuntime(4475):  at android.view.View.layout(View.java:13754) 
10-21 20:18:16.231: E/AndroidRuntime(4475):  at android.view.ViewGroup.layout(ViewGroup.java:4362) 
+3

Bạn không thể sửa đổi giá trị của 'getViewTypeCount' bởi vì phương pháp đó được gọi là một lần duy nhất (nếu tôi không nhầm lẫn) cho bộ điều hợp nhưng bạn có thể làm cho nó trở lại một giá trị mà bạn biết sẽ phù hợp với số lượng tối đa các loại bộ điều hợp sẽ sử dụng (ví dụ 50). Nhưng tôi sẽ quan tâm nhiều hơn đến việc thay đổi liên kết giữa kiểu được trả về và lớp mà nó trỏ đến trong 'getItemViewType' nếu thứ tự thay đổi trong danh sách' itemTypes'. – Luksprog

+0

Ah đã làm các trick !!! cảm ơn bạn rất nhiều! – Richard

Trả lời

1

Giải Quyết với đề nghị từ https://stackoverflow.com/users/493939/luksprog

Thay đổi các phương pháp và đã không tạo ra một thể hiện mới của itemTypes trong initList

@Override 
public int getViewTypeCount() { 
    return 20; 
} 
+1

từ hồ sơ người dùng? – deadfish

+0

@deadfish kiểm tra nhận xét từ Luksprog về câu hỏi ban đầu của tôi – Richard

-4

tôi nghĩ rằng có vấn đề ở đây:

@Override 
public int getViewTypeCount() 
{ 
    int size = itemTypes.size(); 
    return size == 0 ? 1 : size; 
} 

bạn phải luôn luôn trả về kích thước của dữ liệu cung cấp cho bộ chuyển đổi của bạn

thử sau:

@Override 
public int getViewTypeCount() 
{ 
    int size = itemTypes.size(); 
    return size; 
} 
+2

Điều này không đúng. Kích thước của dữ liệu không giống như kích thước của các loại chế độ xem của tôi. – Richard

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