まだ今、FireBase
から一度にすべてのデータを取得しています。データを取得するために実行したいこと[〜#〜]制限[〜#〜]一度に15レコードのように。初めての場合と同様に、ユーザーはFirebase
から15レコードを取得し、ユーザーが画面の下部/上部でより多くのデータをロードする場合、Firebase
から15より多くのレコードを取得して下部に追加する必要があります/リストのTOP。
以下のように、Firebase
からデータベースの上部ORデータベースの下部に15レコードを取得するロジックを実装しました:-
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。 最初のリンク
2。 2番目のリンク
3。 番目のリンク
4。 4番目のリンク
私は最初に15 OR 10レコードを取得するためのロジックを実装しましたが、それは機能します。また、制限内でより多くのレコードをロードするためのロジックを実装しましたが、適切な解決策が得られない(動作していない)、助けて私がどこで間違っているのか教えてください..ありがとう:)
:-私はこのリンクに機能をロードするか、プルして機能を更新します:- Firebase無限スクロールリストビュースクロール時に10項目をロード
orderByKey()
がありません。フィルタリングクエリでは、順序付け関数を使用する必要があります。 ドキュメント を参照してください
onRefresh
メソッドで制限を設定する必要があります:
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() {
.....
したがって、取得したデータは、最初の10レコードを取得した後の唯一の10個の新しいレコードです。
新しく取得したデータの最も古いキーを保存して、次回の更新時にこのキーから新しいデータのみが取得されるようにしてください。
提案:最後のキーを見つけるために子の値リスナーを追加する代わりに、値リスナーを使用して、次のサイズの最後のデータスナップショットを取得できます。最後のレコードのキーを取得します。
データベースを再構築し、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);
注意:リストに新しいコンテンツをロードする場合は、アダプターに注意する必要があります。