如何使用firebase实时数据库在聊天应用程序中创建分页?

时间:2021-02-18 17:04:01

标签: android firebase firebase-realtime-database pagination android-paging

来自说分页适配器不适合聊天应用程序的文档,所以我尝试在 swipeTorefreshLayout 中进行分页

swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
       
            mItemPosition=0;
            int difference =(int)size-messagesList.size();
            if(difference>10){
                page_size =10;
            }else {
                page_size=difference+1;
            }
            if(difference>0){
                fetchMoreMessages();
            }else {
                swipeRefreshLayout.setRefreshing(false);
            }


        }
    });

我还使用了 limitToLast 方法来获取 fetchMesages 方法中的 10 条最新消息

         @Override
                        public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
                            if (snapshot.exists()) {
                                Messages messages = snapshot.getValue(messages.class) 
                               
                            mItemPosition++;
                             if(mItemPosition==1){
                                mLastKey =snapshot.getKey();
                                mPrevKey = snapshot.getKey();
                            }
    
                               messagesList.add(messages);
                                adapter.notifyDataSetChanged();
    
                                mRecyclerView.smoothScrollToPosition(messagesList.size() - 1);
                                swipeRefreshLayout.setRefreshing(false);
                        }
      messageQuery = pairRef.orderByKey().limitToLast(10);
   messageQuery.addChildEventListener(mChildEventListener);

fetchMoreMessages 方法

    if(moreChildEventListener ==null){
        moreChildEventListener = new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
                if (snapshot.exists()) {
                             Messages messages = snapshot.getValue(messages.class) 
                    if(!messageKey.equals(mPrevKey)){
                        messagesList.add(mItemPosition++,messages);

                    }else {

                        mPrevKey = mLastKey;
                    }
                }
                if(mItemPosition==1) {
                    mLastKey = snapshot.getKey();
                }
                adapter.notifyDataSetChanged();
                swipeRefreshLayout.setRefreshing(false);

问题是,当我添加一条新消息时,它会在最后一条消息之后的正确位置显示两次,另一条将显示两条消息,即我之前在 limitToLast 方法()中显示的消息,并在其下方显示新消息

messag10
messag2
messag3
new message
message10
new message

如果我重新启动活动,它会显示它应该是(一条消息)这也用于删除 我认为这个问题是因为使用 limitTolast() 我花了很多时间来寻找解决方案并创建分页,那么如何做到这一点,或者是否有另一种添加分页的最佳方法?感谢任何帮助

2 个答案:

答案 0 :(得分:0)

我个人在使用分页时不使用适配器,当用户到达 ListView 的底部时,我只是将当前列表大小发送到我的服务层。似乎是一个不那么密集和更高效的过程,那么你只需要实现 SKIP 和 TAKE 到 db

private boolean reachedEndOfList(int position)
    {
        return position == this.getCount() - 1;
    }

答案 1 :(得分:0)

你可以试试这个方法

      private void myRecyclerUpdater() {
    mRecycleView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {       //not important
            super.onScrolled(recyclerView, dx, dy);
        }

        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
     
   //try (2) instead of ACTION_DOWN if it didnt work   
  //and we check for scroll state here 0 means IDLE 
      if (!recyclerView.canScrollVertically(MotionEvent.ACTION_DOWN) && newState == 0) {
          //make your data request
           //update your recycler list and notify changes
            }
        }
    });

}