0

i einem Datenspeicher zwei Fragmente und Adapter haben, Hauptidee ist:notifyDataSetChanged nicht mit Fragmenten Arbeits

  1. Fragment 1 onResume() für neue Daten stellen
  2. Daten geladen und die hinzugefügt
  3. auf Datenspeicher
  4. Broadcast sendet eine Nachricht REST_UPDATE_ITEMS
  5. Fragment 1 abfangen, die Nachricht und aktualisieren Elemente in Adapter

Was ist los: Ich öffne Fragment 1 - es ist in Ordnung, neue Daten werden hochgeladen, neue Adapter erstellt und hinzugefügt RecyclerView und ich sehe Elemente in Liste

wenn ich zu Fragment 2 gehe und dann zurück zu Fragment 1 - neue Daten hochgeladen und Fragment 1 Fänge neue Nachricht, aber die Liste ist leer

so: das ist Methode, die Nachricht fängt

case REST_UPDATE_ITEMS: { 
    if (adapter == null) { 
     adapter = new MyAdapter(getActivity(), DataStorage.getInstance().getItems()); 
     recyclerView.setAdapter(adapter); 
    } else { 
     adapter.swap(DataStorage.getInstance().getItems()); 
     getActivity().runOnUiThread(new Runnable() { 
           @Override 
           public void run() { 
            adapter.notifyDataSetChanged(); 
           } 
          }); 
    } 
    break; 
} 

und nichts passiert, wenn notifyDataSetChanged() genannt wird, nur leere Liste, aber wenn i erstellt nur jedes Mal einen neuen Adapter

case REST_UPDATE_ITEMS: { 
      adapter = new MyAdapter(getActivity(), DataStorage.getInstance().getItems()); 
      recyclerView.setAdapter(adapter); 
     break; 
    } 

es funktioniert und Aktualisieren von Daten jedes Mal, aber es blinkt! Jedes Mal, wenn ich sehe, blinkt das nervig.

ich reibungslose Daten Ersatz will, oder einfach nur nicht leere Liste jedes Mal, wenn ich Fragment öffnen: alte Daten -> einigen ausgefallenen Effekt -> neue Daten

Aber jedes Mal, wenn ich Fragment öffnen: leer -> blinken oder sogar Phantasie Effekt -> einige Daten

und das ist Swap-Methode von Adapter:

public void swap(ArrayList<Items> items){ 
    this.items.clear(); 
    this.items.addAll(items); 
} 

Fragmente erzeugt, wenn die Aktivität beginnt und dann nur

öffnen Fragment 2 und

getFragmentManager().beginTransaction().replace(R.id.frame_layout, fragment1).commit(); 

zurück zum Fragmente gehen 1

+0

Bevor Sie notifychange aufrufen, stellen Sie sicher, dass Sie die neuen Daten zuerst zu Ihrer Arraylist hinzufügen, dann notify change –

+0

Daten wurden korrekt hinzugefügt, trotzdem funktionierte es nicht –

Antwort

0

ok, das ist seltsam, aber ich fand Lösung in meinem Layout RecyclerView war Kind von Scroll - i entfernt Scroll und änderte Update-Methode wie folgt:

case REST_UPDATE: { 
    if (adapter == null || recyclerView.getAdapter() == null) { 
     adapter = new adapter(getActivity(), DataStorage.getInstance().getItems()); 
     recyclerView.setAdapter(adapter); 
    } else { 
     adapter.swap(DataStorage.getInstance().getItems()); 
    } 
    getActivity().runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      adapter.notifyDataSetChanged(); 
     } 
    }); 
    break; 
} 

und jetzt funktioniert es, ich verstehe immer noch nicht, kann jemand erklären, was vorging?