Ho creato un'implementazione dell'adattatore personalizzato. Ho anche alcuni tipi di visualizzazione diversi in questo adattatore.Aggiorna dinamicamente i tipi di visualizzazione di ListView
Ho bisogno di sostituire alcune visualizzazioni del mio adattatore in fase di esecuzione. Romain Guy dice che "... cambiando dinamicamente il tipo di vista, il conteggio è un grosso errore" (vedi ArrayAdapter and ListView - ArrayIndexOutOfBoundsException). Qual è il modo corretto di fare ciò in quanto il conteggio del tipo di visualizzazione cambia in modo dinamico?
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();
}
...
aggiorno il mio elemento della lista di tipo dopo ho cambiato i miei dati, ma non funziona come previsto.
I risultati codice in alto nel un'eccezione 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)
Non è possibile modificare il valore di 'getViewTypeCount' perché questo metodo viene chiamato solo una volta (se io non mi sbaglio) per l'adattatore, ma potresti fare in modo che restituisca un valore che sai si adatta al numero massimo di tipi che l'adattatore userà (ad esempio 50). Ma sarei più interessato a cambiare l'associazione tra il tipo restituito e la classe a cui punta in 'getItemViewType' se l'ordine cambia nella lista' itemTypes'. – Luksprog
Ah quello ha fatto il trucco !!! grazie mille! – Richard