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)
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
Ah, który załatwił sprawę !!! Dziękuję bardzo! – Richard