5

我已經創建了一個自定義適配器實現。我在這個適配器中也有一些不同的視圖類型。動態更新視圖類型的ListView

我需要在運行時替換適配器的一些視圖。 Romain Guy說:「......動態改變視圖類型計數,這是一個很大的錯誤」(見ArrayAdapter and ListView - ArrayIndexOutOfBoundsException)。視圖類型計數動態變化時,這樣做的正確方法是什麼?

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

更新我的項目類型列表中,我改變了我的數據之後,但預期它不工作。

上面的代碼會導致產生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

因爲該方法只調用一次不能修改getViewTypeCount'的'值(如果我沒有錯),但是你可以讓它返回一個你知道的值,以適應適配器將使用的最大數量的類型(例如50)。但如果訂單在'itemTypes'列表中發生變化,我會更加關注如何更改返回類型與它指向'getItemViewType'的類之間的關聯。 – Luksprog

+0

啊,做了伎倆!非常感謝! – Richard

回答

-4

沒有創造itemTypes的新實例我認爲這裏有問題:

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

,你必須總是返回以下提供給您的適配器

試數據的大小:

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

這是不正確的。數據的大小與我的視圖類型的大小不一樣。 – Richard