2013-04-25 13 views
9

Ich erstelle eine Kontaktliste App mit Fragmenten, wobei ein Frag eine Liste von Namen in der Kontaktliste ist und der andere die restlichen Details. HierRefreshing ArrayAdapter onResume [notifyDataSetChanged() funktioniert nicht]

ist die Klasse, die die Liste der Namen zeigt

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"); 

} 
} 

Das Problem, das ich habe ist, dass die ArrayAdapter nicht auf Lebenslauf nicht aktualisieren.

Wenn der Bildschirm gedreht wird, ist seine feine wie OnCreateView() erneut ausgeführt, aber ich brauche es auf OnResume zu aktualisieren. Ich habe über diese Site nachgeladen und nichts gefunden außer "notifyDataSetChanged()" zu benutzen, was nicht funktioniert.

+0

Nun, was erwarten Sie? Sie rufen die 'Einträge' ab, bauen aber Ihren 'Adapter' nicht neu auf.Verschiebe die beiden Zeilen 'volts =' und 'adapter =' von 'onCreate()' nach 'onResume()' (das solltest du nur einmal tun), vergiss 'entries =' und 'notify' in' onResume() ' und dir wird es gut gehen. –

+0

@ClassStacker - Immer noch das gleiche Problem. Aktualisiert die Liste erst, wenn der Bildschirm gedreht wurde. – RockJake28

+0

Umm ja, tut mir leid, Sie müssen auch die SetListAdapter() dort tun. –

Antwort

29

Das Problem, das Sie haben, ist, dass Sie die Einträge Referenz überschreiben und es wird nicht auf dem Adapter geändert. Hier ist, wie Sie können dieses Problem beheben

@Override 
public void onResume() { 

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

} 

dies ist ein häufiger Fehler zu machen, es verursacht, weil, wenn Sie zuerst eine Liste erstellen (im Speicher) und Ihr entries Feld zeigen auf, dass Sie dann die adapter sagen, zu betrachten diesen Speicherort, wenn Sie es erstellen, aber onResume Sie eine neue Liste im Speicher erstellen (wenn Sie die Namen der Kontaktliste erneut erhalten) und Sie die Einträge auf diese neue Liste im Speicher zeigen, was Sie tun müssen, ist die Einträge in ersetzen die ursprüngliche Liste mit den Einträgen in der neuen Liste, so dass die adapter immer noch auf die gleiche Liste verweist.

+0

Perfekt! Ich wusste, dass etwas mit ".add()" zu tun hatte, aber ich konnte keine klare Antwort zu dem Thema bekommen. Vielen Dank! – RockJake28

+1

Ich fügte eine bessere Erklärung zu diesem Thema hinzu. Eine andere Möglichkeit, wie Sie es mit Ihrem ArrayAdapter tun können, ist in resume 'adapter.clear();' dann 'adapter.addAll (contactStorage.getContactListNames());' und vergessen Sie einfach die Einträge alle zusammen. – Eluvatar

+0

Danke Kumpel, addAll hat die Magie;) – Salmaan

4

notifyDataSetChanged() wird nicht für Sie arbeiten. Gründe warum

Ihr Adapter verliert Bezug auf Ihre Liste. Wenn Sie den Adapter zuerst initialisieren, benötigt er einen Verweis auf Ihre ArrayList und übergibt ihn an seine Superklasse. Aber wenn Sie Ihre vorhandenen Arraylist neu initialisieren losts sie den Verweis daher der Kommunikationskanal mit Adapter :(

immer das Erstellen und Hinzufügen einer neuen Liste der Adapter Sie wie folgt aus:..

  1. Initialisieren der Arraylist während global zu deklarieren.
  2. Liste hinzufügen auf den Adapter direkt mit aus null und leeren Zustand zu überprüfen. Setzen Sie den Adapter in die Liste direkt (prüfe nicht für Zustand). Adapter gibt Ihnen die Garantie, dass, wo immer Sie sind Ändert die Daten von ArrayList wird es vorsichtig sein, aber nie die Referenz verlieren.
  3. Hinzufügen von Daten zu der ArrayList Jedes Mal (wenn Ihre Daten vollständig neu sind als Sie können adapter.clear() und arrayList.clear() vor tatsächlich Daten in die Liste hinzufügen), aber nicht den Adapter dh wenn die neuen Daten in der Arraylist bevölkert als nur adapter.notifyDataSetChanged()

Halten Vertrauen Documenta

Verwandte Themen