0

Für eine App, die ich erstellen, habe ich eine RecyclerView, die mit Daten aus einer Firebase-Datenbank gefüllt wird. Diese RecyclerView befindet sich auch in einem Fragment, das in einem Viewpager verwendet wird. Alles, was ich kann, ist, dass es funktioniert, aber was ich merke ist, dass es beim ersten Durchlauf eine Weile dauert, bis das Fragment seinen Inhalt in der RecyclerView anzeigt, also wollte ich ihm eine Fortschrittsbalken als Asynchron hinzufügen Aufgabe.Verstecken ProgressBar einmal RecyclerView.setAdapter ist fertig Android

Meine Aufgabe:

private class ProgressTask extends AsyncTask<Void, Void, Void> { 
     @Override 
     protected void onPreExecute() { 
      mProgressLinearLayout.setVisibility(View.VISIBLE); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      loadColleagueData(); 
      mListener = initRealTime(); 
      mAdapter = new CustomAdapter(mUserList, getActivity()); 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void res) { 
      mRecyclerView.setAdapter(mAdapter); 
      mProgressLinearLayout.setVisibility(View.GONE); 
     } 
    } 

Jetzt funktioniert dies tatsächlich. Die ProgressBar wird angezeigt und auch wieder ausgeblendet, sobald sie fertig ist. Aber das Problem ist, dass es in so kurzer Zeit gemacht wird, dass es nicht sichtbar ist. Ich weiß nur, dass es wegen Debugging funktioniert. Was noch etwas dauert, ist der RecyclerView, der den Inhalt zeigt.

Also, was ich mein Problem ist, ist, dass nicht so sehr die Daten aus der Datenbank ist die Sache, die eine Weile dauert, nur mehr den Adapter auf die RecyclerView setzen und zeigt seinen Inhalt ist die Sache, die eine Weile dauert .

Nun von was ich verstanden habe, ist, dass es nicht möglich ist, den Adapter in der doInBackground einzustellen, da Sie nichts mit den Ansichten außerhalb des Haupt-Ui-Thread tun können. Also habe ich mich gefragt, ob es eine Möglichkeit gibt, die ProgressBar nur dann zu verstecken, wenn der Inhalt in meinem RecyclerView sichtbar ist?

für (Wenn dies eine doppelte Frage ist, ich bin furchtbar leid, meine Suche im Internet nicht verwalten, mir zu helfen)

+0

Hat meine Antwort Ihnen geholfen? –

Antwort

0

Sie sollten die FirebaseDatabase Rückrufe verwenden, Sie brauchen nicht eine AsyncTask verwenden Dies. Wenn Sie was für einzelnes Ereignis zu hören, das bedeutet, dass Sie nur die Daten herunterladen möchten, dann verwenden:

 mProgressLinearLayout.setVisibility(View.VISIBLE); 
     DatabaseReference node = FirebaseDatabase.getInstance().getReference().child("your_node"); 
     node.addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       loadColleagueData(); 
       mListener = initRealTime(); 
       mAdapter = new CustomAdapter(mUserList, getActivity()); 
       mRecyclerView.setAdapter(mAdapter); 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 
     mProgressLinearLayout.setVisibility(View.GONE); 

Wenn Sie Ihren Adapter wollen Allways werden up-to-date können Sie Zuhörer, dass anhängen bestimmte Knoten mit addChildEventListener() oder addValueEventListener() (docs here). Oder Sie können diese Rost Bibliothek verwenden, müssen Sie nur eine Datei kopieren:

https://github.com/mmazzarolo/firebase-recyclerview

Verwandte Themen