5

Utworzono niestandardową implementację adaptera. Mam również kilka różnych typów widoku w tym adapterze.Dynamicznie aktualizuj typy widoków ListView

Potrzebuję zamienić niektóre widoki mojego adaptera w czasie wykonywania. Romain Guy mówi, że "... zmiana typu widoku jest dynamicznie liczona, co jest dużym błędem" (patrz: ArrayAdapter and ListView - ArrayIndexOutOfBoundsException). Jaki jest prawidłowy sposób wykonywania tej czynności, ponieważ liczba typów widoku zmienia się dynamicznie?

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

zaktualizować listy typ elementu po Zmieniłem moje dane, ale to nie działa zgodnie z przeznaczeniem.

Powyższe wyniki kodu w wyjątek 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

Nie można zmodyfikować wartość 'getViewTypeCount' ponieważ ta metoda jest wywoływana tylko raz (jeśli nie mylę się) dla adaptera, ale możesz zwrócić wartość, o której wiesz, że będzie pasować do maksymalnej liczby typów, które będą używane przez adapter (na przykład 50). Ale byłbym bardziej zainteresowany zmianą powiązania między zwróconym typem a klasą, do której on wskazuje w 'getItemViewType', jeśli kolejność zmieni się na liście' itemTypes'. – Luksprog

+0

Ah, który załatwił sprawę !!! Dziękuję bardzo! – Richard

Odpowiedz

-4

Myślę, że jest tu problem:

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

musi zawsze powrócić rozmiaru danych dostarczonych do adaptera

try następujący:

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

To nie jest prawda. Rozmiar danych nie jest taki sam, jak rozmiar moich typów widoku. – Richard