2017-02-28 3 views
9

をリフレッシュしてロードするためにプルを実行するには、Get今私は15のようなLIMITS内のデータを取得することを私はやりたい1 time.WhatでFireBaseからすべてのデータを取得しています一度にレコード。初めてのユーザーと同じように、Firebaseから15レコードを取得し、ユーザーが画面の下部/ TOPに1539を超えるレコードを追加し、リストの下部/ TOPに追加する必要があります。

私は以下のようにFirebaseからデータベースの上部または下部に15件のレコードを取得するためのロジックを実装している: -限度内Firebaseからのデータは、まだ多くの機能

public class ChatActivity extends AppCompatActivity implements FirebaseAuth.AuthStateListener { 

    private FirebaseAuth mAuth; 
    private DatabaseReference mChatRef; 

    private Query postQuery; 
    private String newestPostId; 
    private String oldestPostId; 
    private int startAt = 0; 
    private SwipeRefreshLayout swipeRefreshLayout; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_chat); 

     mAuth = FirebaseAuth.getInstance(); 
     mAuth.addAuthStateListener(this); 

     mChatRef = FirebaseDatabase.getInstance().getReference(); 
     mChatRef = mChatRef.child("chats"); 

     /////GETTING THE VIEW ID OF SWIPE LAYOUT 
     swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout); 

    /////GETTING FIRST 10 RECORDS FROM THE FIREBASE HERE 
     mChatRef.limitToFirst(10).addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       for (DataSnapshot child : dataSnapshot.getChildren()) { 
        oldestPostId = child.getKey(); 
        System.out.println("here si the data==>>" + child.getKey()); 
       }  
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 

     //////FOR THE PULL TO REFRESH CODE IS HERE 
     swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 
      @Override 
      public void onRefresh() { 
       // Refresh items 

      System.out.println("Here==>>> "+oldestPostId); 

       ///HERE "oldestPostId" IS THE KEY WHICH I GET THE LAST RECORDS FROM THE FIREBASE 

       mChatRef.startAt(oldestPostId).addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       for (DataSnapshot child : dataSnapshot.getChildren()) { 

        System.out.println("here AFTER data added==>>" + child.getKey()); 
       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 

      } 
     }); 
    } 

私はSOそれのためにここで検索しましたが、期待されていませんでした私はそれ

1. First Link
2. Second Link
3. Third Link
4. Forth Linkで検索しましたリンクの下の結果、

私のfirebaseのデータ構造を画像で見てください。
Data of firebase

は私が初めてで取得15のOR 10のレコードのロジックを実装しているし、それはまた、得ていない(動作しない)適切な解決策を限度に複数のレコードをロードするためのロジックを実装しますがworks..and私が間違っていることを教えてください。ありがとうございます:)

+0

https://github.com/milon87/ShakeTopUp/tree/master/app/src/main/java/xyz/enableit/shaketopup/offer これを確認できます。これはMVPによって実装されています。 ModelOfferImpl.javaファイルをチェックしてください。それが助けてくれることを願って。 –

+0

これがこの問題の完全な解決策を得るために参照してください: - https://stackoverflow.com/a/44796538/3946958 –

答えて

7

あなたがいないorderByKey()があります。フィルタリングクエリの場合は、順序付け関数を使用する必要があります。あなたが最初の10件のレコードを得た後、あなたが取得するデータはわずか10の新しいレコードである

public void onRefresh() { 
    // Refresh items 
    ///HERE "oldestPostId" IS THE KEY WHICH I GET THE LAST RECORDS FROM THE FIREBASE 
       mChatRef.orderByKey().startAt(oldestPostId).limitToFirst(10).addListenerForSingleValueEvent(new ValueEventListener() { 
..... 

:あなたは制限を設定する必要があり、あなたのonRefresh方法でdocumentation

を参照してください。

次回のリフレッシュ時に、このキーからの新しいデータのみを取得できるように、新しく取得したデータの最も古いキーを保存してください。

提案:代わりに最後のキーを見つけるために、子の値リスナーを追加するので、あなただけの最後のレコードのキーを取得するために、サイズと値のリスナーを使用し、最後のデータのスナップショットを取得することができます。

+0

あなたはあなたの提案のための例を示していることはできますか? )(あなたがorderByKeyとの組み合わせでstartAt(String値)、ENDAT(String値)またはequalTo(文字列値)を使用する必要があります。また、何らかの理由で私はあなたと同様の使用していますが、私は取得しています: 'java.lang.IllegalArgumentExceptionがします。他のタイプの値または2つのパラメータを持つバージョンを使用することはサポートされていません ' 私のコードは 'photoRerence.orderByKey()。startAt(oldestPostId).limitToFirst(6).addListenerForSingleValueEvent(new ValueEventListener(){' –

+0

@TalC 。あなたのエラーは、私は私の答えで最初に述べたように同じことを言います。それは私には罰金だので、あなたが共有し、同じ行でエラーを取得しているあなたはよろしいです。 – kirtan403

+0

私はその行でエラーを取得しています。私がいることを考えていますこれは、特定のキーが呼び出される前にロードされていないことが原因である可能性があります。これは、私のアプリケーションでバグのある別のライブラリを使用しているためです。私はそれがクラッシュすると仮定している理由はFirebaseからの情報です。私は手動でキーを入れればうまくいくので、私はこのバグを修正するために1つのバグを修正する必要があるようです。 1つのバグ、99以上の笑を取得します。 –

2

再構築、データベース、0,1,2,3のような増分で新しい子IDを設定...など

"chats": { 
"-KZLKDF": { 
    "id": 0, 
    "message": "Hi", 
    "name":"username" 
}, 

クエリ

public void loadFromFirebase(int startValue,int endValue){ 

mChatRef.orderByChild(id).startAt(startValue).endAt(endValue).addListenerForSingleValueEvent(this); 
} 

する方法は確認して作りますaddListenerForSingleValueEventを実装してから、アダプタ関連のタスクを実行します。 は当初のonCreateメソッドからの呼び出し:

loadFromFirebase(0,10); 

NB:あなたはアダプタと認識する必要があり、リストに新しいコンテンツをロードします。

+0

あなたの答えをありがとう..あなたの努力のための+1 .. @ kirtan403は私の問題を解決しました..入力のためのおかげで –

関連する問題