1

在此聊天应用程序中,我使用的是FirebaseIndexRecyclerAdapter,我想加载20个20个消息项目。在开始时,我设置keyReg使用FirebaseIndexRecyclerAdapter加载20个项目

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

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

(在recyclerview.addOnScrollListener),我m这样做:

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,则40开始,然后60消息时,都20个项目中负载20更好? 因为如果我从oldestPostId每次开始,如何回来并再次显示过去20条消息?

回答

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

+0

感谢的人,但我不是如此好在firebase,我现在不怎么如何使用功能...但我的问题不是如何得到lastOneKey,它在我的代码中正确工作,开始我得到正确的lastOnekey,每次当我滚动,我得到正确的lastOnekey下20项..我的问题是,当滚动完成,我做新的keyRef与.startAt(lastOnekey),刷新适配器,没有任何反应......如果我尝试,而不是刷新,重新激活适配器,然后出现下20个项目,但以前的20个项目消失...不附加新的消息,但用新的替换...我想在下面显示一条新消息... – bojan

+0

是否甚至可以使用firebaseindexrecycleradapter? – bojan

相关问题