使用FirebaseIndexRecyclerAdapter加载20个项目20

时间:2017-07-16 11:07:43

标签: android firebase firebase-realtime-database recycler-adapter firebaseui

在这个聊天应用中,我正在使用FirebaseIndexRecyclerAdapter,我希望加载20个消息项目。一开始,我设置keyReg

  keyRef=mFirebaseDatabaseReference
        .child("messagesKeys")
        .child(usernameFromEmail(mFirebaseUser.getEmail()))
        .child(room_type_1)
        .limitToFirst(20);

然后我得到lastMessageId

keyRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            for (DataSnapshot child : dataSnapshot.getChildren()) {

                    oldestPostId = child.getKey();
                 }
            }
         }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

我开始FirebaseIndexRecyclerAdapter

mFirebaseAdapter = new FirebaseIndexRecyclerAdapter<FriendlyMessage,MessageViewHolder>(
            FriendlyMessage.class,
            R.layout.item_message,
            MessageViewHolder.class,
            keyRef,
            mFirebaseDatabaseReference.child("messages").child(room)) {...}

isScrollCompleted()方法(在recyclerview.addOnScrollListener中),我这样做:

 private void isScrollCompleted() {
   if (totalItem - currentFirstVisibleItem == currentVisibleItemCount
       && this.currentScrollState == SCROLL_STATE_IDLE) {
            keyRef=mFirebaseDatabaseReference
                    .child("messagesKeys")
                    .child(usernameFromEmail(mFirebaseUser.getEmail()))
                    .child(room_type_1)
                    .orderByKey()
                    .startAt(oldestPostId)
                    .limitToFirst(limit);



            mFirebaseAdapter.notifyDataSetChanged();


            keyRef.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    boolean is=true;
                    for (DataSnapshot child : dataSnapshot.getChildren()) {

                        oldestPostId = child.getKey();

                    }

                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
    }

所以我希望每次滚动完成后,创建一个新的keyRef,刷新firebaseIndexAdapter,并显示接下来的20条消息,但这不起作用! 在我使用keyRef创建新mFirebaseAdapter.notifyDataSetChanged()并刷新后,没有新帖子和前20个帖子消失。

我的问题是,每次从.startAt(oldestPostId)开始加载20个项目,或者加载20个,然后是40个,然后加载60个邮件是否更好? 因为如果我每次都从oldestPostId开始,那么如何回来并再次显示过去的二十条消息?

1 个答案:

答案 0 :(得分:0)

您显然不会以适当的方式将新加载的项目附加到RecyclerView.Adapter项目中...

String lastOneKey = null; int limit = 20;

keyRef.orderByKey().limitToFirst(limit).once('value', function(snapshot) {
    snapshot.forEach(function(childSnapshot) {

        /* that key needs to be updated in here */
        lastOneKey = childSnapshot.getKey();
    });
});

然后在isScrollCompleted()方法中:

keyRef.orderByKey().startAt(lastKnownKey).limitToFirst(limit).once('value', function(snapshot) {
    snapshot.forEach(function(childSnapshot) {

        /* and it needs to be updated in here */
        lastOneKey = childSnapshot.getKey();
    });
});

而不是消隐适配器,必须添加一个项目,然后通知RecyclerView.Adapter有关正在插入的项目(适配器位置,其中添加了新项目,始终是已经的长度)现有的项目,因此该索引是基于0)...一个也可以一次插入20的范围 - 但更好的开始简单。甚至会建议为RecyclerView.Adapter的最后一个密钥添加一个getter / setter。

@see DataSnapshot