2

Ich bin Bulding-App, die Krypto Währungen überwacht, ich benutze Firebase UI, und alles hat gut funktioniert, bis ich versuchte, den Adapter zu aktualisieren (Firebase unterstützt Clientseite Filtering) und ich bin Hinzufügen der "Suche" -Funktion. Ich erhalte den aktualisierten Wert, aber meine Daten werden unter die vorherigen RecyclerView-Auflistungen verschoben (welche wird unsichtbar, nimmt aber Platz). Ich denke, ich vermisse eine Art "Clear Recyclerview" -Funktion. BTW. Ich benutze das in Fragment. Bitte helfen Sie.Aktualisieren Firebase RecyclerviewAdapter löscht keine vorherige Liste

Vielen Dank im Voraus.

mRecyclerView.setHasFixedSize(true); 
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this.getActivity())); 


    @Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 

    inflater.inflate(R.menu.menu,menu); 
    MenuItem item = menu.findItem(R.id.action_search); 

    SearchView searchView = (SearchView)item.getActionView(); 

    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
     @Override 
     public boolean onQueryTextSubmit(String query) { 

      return false; 
     } 

     @Override 
     public boolean onQueryTextChange(String newText) { 
      Log.i(TAG,newText); 

      Query ref1 = FirebaseRef.getDatabase().child("Coins"); 

      mAdapter = new FirebaseRecyclerAdapter<Coins, CoinsViewHolder>(Coins.class, R.layout.coins_card, CoinsViewHolder.class, 
        ref1.orderByChild("short").startAt(newText).endAt("~").limitToFirst(3)) { 
       @Override 
       public void populateViewHolder(CoinsViewHolder coinsViewHolder, Coins coinsData, int position) { 

        if(coinsData.getName() != null){ 
         coinsViewHolder.setmNameTextView(coinsData.getName()); 

        } 

        if(coinsData.getPrice() != null) { 
         coinsViewHolder.setmPriceTextView(coinsData.getPrice()); 
        } else if(coinsData.getCap24hrChange() != null){ 
         coinsViewHolder.setmPercentChangeTextView(coinsData.getCap24hrChange());} 

        coinsViewHolder.bind(coinsData); 

       } 
      }; 

      mRecyclerView.addItemDecoration(new MaterialViewPagerHeaderDecorator()); 
      mRecyclerView.setAdapter(mAdapter); 
      MaterialViewPagerHelper.registerRecyclerView(getActivity(), mRecyclerView); 


      return true; 
     } 
    }); 

    super.onCreateOptionsMenu(menu,inflater); 
} 

enter image description here

enter image description here

Antwort

0

Sie setzen den Adapter bei jedem Text hinzugefügt wird. Verschieben Sie die Adapterinitialisierung in oncreate und aktualisieren Sie dann nur die Firebase-Abfrage bei Textänderungen.

Wenn Sie nur frische Daten aus der Datenbank in die Recycleransicht laden möchten, löschen Sie die Liste mit den Daten für den Adapter und rufen Sie dann neue Daten auf und rufen Sie notify dataset changed an.

+0

danke für die schnelle Antwort, aber könnten Sie teilen, wie Sie die Abfrage von der onCreateOptionsMenu aktualisieren, während es in OnCreate ist? :) –

+1

Das Problem ist, dass Sie in Ihrem Anwendungsfall nicht direkt den Recycler-Adapter FirebaseUI verwenden können, da Sie Ihre Abfrage kontinuierlich ändern müssen, müssen Sie Ihren eigenen Recycler-Adapter verwenden. Der UI-Adapter ist gut für Anwendungsfälle wie Chat-App, wo die Änderungen in der Recycler –

+0

Ich erstellte öffentlichen ref-Instanz erstellt und Adapter auf OnCreate verschoben, aber wenn ich ref1 ändern Wert Adapter wird nicht geändert. Also sollte ich wirklich aufhören, Firebases Adapter zu benutzen? :/ –