0

作成しているアプリの場合FirebaseデータベースのデータでいっぱいになるRecyclerViewがあります。このRecyclerViewは、Viewpagerで使用されるフラグメントにもあります。私はそれを動作させることができますが、私が気づくのは、最初の実行時に断片がRecyclerViewのコンテンツを表示するのに時間がかかるため、ProgressBarを非同期仕事。RecyclerView.setAdapterが完了したらProgressBarを非表示にするAndroid

マイタスク:

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

さて、これは実際に動作します。 ProgressBarが表示され、完了したら再び非表示になります。しかし問題は、それが目に見えないほど短時間で済むことです。だから私はそれがデバッグのために動作することを知っているだけです。まだまだ時間がかかるのは、RecyclerViewが実際にコンテンツを表示していることです。

私の問題は、データベースからデータを取得するのはそれほど時間がかかることではなく、アダプタをRecyclerViewに設定してコンテンツを表示することはしばらく時間がかかることです。

私が理解したところでは、doInBackgroundにアダプタを設定することはできません。これは、メインのUIスレッドの外側のビューでは何もできないためです。だから、コンテンツが自分のRecyclerViewに表示されたらProgressBarを隠す方法があるのだろうかと思っていたのですか?

、あなたがAsyncTaskを使用する必要はありません

+0

:それとも、この火格子のライブラリを使用することができ、あなただけのファイルをコピーする必要がありますか? –

答えて

0

あなたはFirebaseDatabaseコールバックを使用する必要があります(これは私はひどく申し訳ない重複質問であれば、インターネット上の私の検索が私を助けるために管理していませんでした)この。あなたのアダプタは、あなたがそれにリスナーを添付することができます最新オールウェイズになりたい場合は

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

:単一のイベントをリッスンするためにあなたが、それはあなただけのデータをダウンロードすることを意味している場合、これを使用addChildEventListener()またはaddValueEventListener()(docs here)を使用して、特定のノードを特定します。私の答えはあなたを助けました

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

関連する問題