0

derzeit Daten auf FirebaseRecyclerAdapter ändern Ich bin mit FirebaseRecyclerAdapter Daten auf einem RecyclerView repräsentieren die folgende Firebase Abfrage:Der beste Weg

postsQuery = mDatabase.child("lists_new”).orderByKey().limitToFirst(10); 

Mein RecyclerView hat einen Header mit 2 Tasten: Neue Liste, Alt Liste. Neue Liste wird standardmäßig geladen, und meine Frage ist, wenn der Benutzer auf die Schaltfläche Alte Liste antippt, was ist die effizienteste Möglichkeit, die neue Liste durch alte Liste zu ersetzen.

Die Firebase Abfrage für die alte Liste sieht wie folgt aus:

postsQuery = mDatabase.child("lists_old”).orderByKey().limitToFirst(10); 

Hinweis: sowohl neue Liste und die alte Liste mit den gleichen Datentypen hat, dh sie haben die gleiche Java POJO Klasse teilen und die gleiche Layout.

Antwort

1

Ich habe ein ähnliches Bedürfnis und eine ähnliche Lösung, außer ich Bereinigung nenne() auf dem Adapter vor einen anderen neu machen. Ich denke, ohne aufzuräumen() wird es ein Leck von Adaptern und/oder Zuhörern schaffen?

In onActivityCreated() in meinem Fragment rufe ich eine Methode im Fragment auf, die die Recycleransicht verwaltet. Rufen Sie die Methode zum Initialisieren oder Aktualisieren der Liste auf und übergeben Sie einen Blattknotennamen. Wenn der Adapter nicht null ist, rufen Sie cleanup() auf. Erstellen Sie eine neue Datenbankreferenz, indem Sie einen neuen Blattknoten mit der übergeordneten Referenz verketten, einen neuen Adapter neu erstellen und festlegen.

Ich rufe cleanup() in onDestroy() auch, wie üblich.

Es funktioniert soweit, obwohl ich nur mit dem Emulator und einem kleinen Datensatz getestet habe.

@Override 
public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

    refreshList(newLeafNode); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    mRVAdapter.cleanup(); 
} 

protected void refreshList(String newLeafNode) { 

    if (mRVAdapter != null) { 
     mRVAdapter.cleanup(); 
    } 

    DatabaseReference newDbRef = mParentRef.child(newLeafNode); 

    mRVAdapter = new FirebaseRecyclerAdapter<String, MyViewHolder>(String.class, R.layout.single_row, MyViewHolder.class, newDbRef) { 
     @Override 
     protected void populateViewHolder(MyViewHolder viewHolder, String model, int position) { 
      viewHolder.setImage(model); 
     } 
    }; 
    mMyRV.setAdapter(mRVAdapter); 
} 
+0

Awesome, ich denke, Sie haben Recht, Aufruf Cleanup() ist notwendig, um Lecks zu Echtzeit-Datenbank-Listener zu vermeiden. Vielen Dank. – ThunderRoid

2

Sie benötigen einen neuen Adapter und verbinden ihn mit demselben RecyclerView.

So, nachdem die neue Abfrage Konstruieren Sie einen neuen Adapter erstellen und zu der Ansicht anhängen:

adapter = new FirebaseRecyclerAdapter<Chat, ChatHolder>(
    Chat.class, android.R.layout.two_line_list_item, ChatHolder.class, postsQuery) { 
recyclerView.setAdapter(adapter); 
+0

Ja, ich mache es gerade so, aber ist das wirklich der effizienteste Weg, dies zu tun? Nur neugierig, vielen Dank für die schnelle Antwort. – ThunderRoid

+0

Ich kenne keinen effizienteren Ansatz. Ich habe auch keinen Grund zu glauben, dass es ineffizient ist. Wenn Sie andere Erfahrung haben, teilen Sie bitte Details. –

+0

Es ist nur, dass ich eine changeQuery gesehen habe (Query ref); Methode in FirebaseRecyclerAdapter. – ThunderRoid