【问题标题】:how to create pagination in chat app using firebase real time database?如何使用firebase实时数据库在聊天应用程序中创建分页?
【发布时间】:2021-02-18 17:04:01
【问题描述】:

从文档中说分页适配器不适合聊天应用程序,所以我尝试在 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() 我花了很多天来寻找解决方案并创建分页,所以如何做到这一点,或者是否有另一种添加分页的最佳方法?任何帮助表示赞赏

【问题讨论】:

  • 说明分页适配器不适合聊天应用程序的文档没有任何意义。如果您只想显示最后 10 条消息怎么办?当然,分页对于任何类型的冗长列表都是有意义的。我认为需要澄清
  • @Jay 使用分页适配器时添加新消息时出现的问题,除非我重新启动活动,否则它不会显示,所以我浪费了实时功能
  • 首先请更新您的问题并提供更多代码,一些变量使用不明确,以便我们提供帮助。其次,在这种情况下滑动刷新布局不是一个好的用户体验,所以你可以在你的 Recycleview 适配器上尝试 onScroll
  • @HossamAli 我试过 onScroll 但它一直滚动到底部,如果你有一些代码来实现 onscroll 并在滚动到顶部以获取更多消息时添加更多消息,请提供它,我试过了很多但没有任何结果

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


【解决方案1】:

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

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

【讨论】:

  • 您能否提供更多详细信息和一些关于您的想法以及如何将其应用于 Firebase 的代码? @Dean Beckerton
【解决方案2】:

你可以试试这个方法

      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
            }
        }
    });

}

【讨论】:

    猜你喜欢
    • 2019-02-23
    • 1970-01-01
    • 2017-11-16
    • 2016-06-28
    • 2020-06-13
    • 2016-09-27
    • 2018-10-13
    • 2018-10-13
    • 1970-01-01
    相关资源
    最近更新 更多