2013-04-25 14 views
9

Sto creando un'app elenco contatti utilizzando Fragments dove un frag è un elenco di nomi nell'elenco contatti e l'altro è il resto dei dettagli.Refreshing ArrayAdapter onResume [notifyDataSetChanged() non funziona]

Qui è la classe che visualizza l'elenco dei nomi

public class MyListFragment extends ListFragment { 

private ContactStorage contactStorage = new ContactStorage(); 

public final static String TAG = "FRAGMENTS"; 
private MainActivity parent; 
ArrayAdapter<String> adapter; 

ArrayList<String> entries = new ArrayList<String>(); 

String array[]; 

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    View v = inflater.inflate(R.layout.list_layout, null); 
    parent = (MainActivity) getActivity(); 
    entries = contactStorage.getContactListNames(); 

    adapter = new ArrayAdapter<String>(getActivity().getApplicationContext(), 
      android.R.layout.simple_list_item_1, entries); 

    setListAdapter(adapter); 
    Log.d(TAG, "Adapter created"); 
    array = contactStorage.getContactDetails(); 
    return v; 

} 

@Override 
public void onResume() { 

    super.onResume(); 
    entries = contactStorage.getContactListNames(); 
    adapter.notifyDataSetChanged(); 
    Log.d(TAG, "List Frag Resumed"); 

} 
} 

Il problema che sto avendo è che l'ArrayAdapter non si aggiorna sul curriculum.

Quando lo schermo viene ruotato, la sua multa come onCreateView() viene eseguita nuovamente, ma è necessario aggiornarla su Riduci. Ho esaminato il carico di questo sito e non ho trovato altro che "use notifyDataSetChanged()" che non funziona.

+0

Beh, cosa vi aspettate? Stai recuperando le 'voci' ma non stai ricostruendo il tuo' adattatore'.Sposta le due righe 'entires =' e 'adapter =' da 'onCreate()' a 'onResume()' (dovresti farlo una sola volta), dimenticati di 'entries =' e 'notify' in' onResume() ' e starai bene. –

+0

@ClassStacker - Ancora lo stesso problema. Non aggiorna l'elenco finché lo schermo non viene ruotato. – RockJake28

+0

Umm sì, mi dispiace, dovrete anche fare il setListAdapter() lì. –

risposta

29

il problema che si sta verificando è che si sta sovrascrivendo il riferimento alle voci e che non viene modificato nell'adattatore. Ecco come si può risolvere questo

@Override 
public void onResume() { 

    super.onResume(); 
    entries.clear(); 
    entries.addAll(contactStorage.getContactListNames()); 
    adapter.notifyDataSetChanged(); 
    Log.d(TAG, "List Frag Resumed"); 

} 

questo è un errore comune da fare, è causato perché quando si crea una lista (in memoria) e le vostre entries punti di campo a ciò, è poi dire al adapter a guardare quella posizione di memoria quando la crei, ma onResume crei un nuovo elenco in memoria (quando ottieni di nuovo i nomi dell'elenco dei contatti) e comunichi alle voci di puntare a quel nuovo elenco in memoria, ciò che devi fare è sostituire le voci in l'elenco originale con le voci nel nuovo elenco, in questo modo lo adapter farà ancora riferimento alla stessa lista.

+0

Perfetto! Sapevo che c'era qualcosa a che fare con '.add()' ma non riuscivo a ottenere una risposta chiara sull'argomento. Grazie mille! – RockJake28

+1

Ho aggiunto una spiegazione migliore del problema. un altro modo in cui puoi farlo con il tuo ArrayAdapter è su resume 'adapter.clear();' then 'adapter.addAll (contactStorage.getContactListNames());' e dimentica il campo delle voci tutti insieme. – Eluvatar

+0

grazie amico, addAll ha fatto la magia;) – Salmaan

4

notifyDataSetChanged() non funziona per voi. Motivi per cui

L'adattatore perde il riferimento all'elenco. Quando si inizializza la scheda per la prima volta, prende un riferimento alla propria lista array e passa alla sua superclasse. Ma se reinizializzare le arrayList esistente è losts il riferimento da cui il canale di comunicazione con l'adattatore :(

creando sempre e l'aggiunta di un nuovo elenco all'adattatore fare in questo modo:..

  1. Inizializzare l'arrayList
  2. Aggiungi elenco all'adattatore direttamente con controllo fuori condizione vuoto e vuoto . Imposta l'adattatore direttamente nell'elenco (non verificare le condizioni ). L'adattatore ti garantisce che ovunque tu sia cambia i dati di arrayList si prenderà cura, ma non perdere mai il riferimento .
  3. Aggiungere dati all'arraylist Ogni volta (se i dati sono completamente nuovi, , è possibile chiamare adapter.clear() e arrayList.clear() prima di aggiungendo effettivamente i dati all'elenco), ma non impostare l'adattatore, ad esempio Se il nuovo di dati viene popolata nel arrayList non solo adapter.notifyDataSetChanged()

mantenere la fiducia di Documentazioni

Problemi correlati