5

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) 
+3

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

+0

Ah quello ha fatto il trucco !!! grazie mille! – Richard

risposta

1

risolto con suggerimento https://stackoverflow.com/users/493939/luksprog

Modificato questi metodi e non crearono una nuova istanza di itemTypes in initList

@Override 
public int getViewTypeCount() { 
    return 20; 
} 
+1

dal profilo utente ?? – deadfish

+0

@deadfish controlla il commento di Luksprog sulla mia domanda originale – Richard

-4

Penso che ci sia un problema qui:

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

si deve sempre restituire la dimensione dei dati forniti per l'adattatore

prova seguente:

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

Questo non è vero. La dimensione dei dati non è uguale alla dimensione dei miei tipi di vista. – Richard

Problemi correlati