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)
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
Ah đã làm các trick !!! cảm ơn bạn rất nhiều! – Richard