亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

嘗試加載新數據時 Firebase LimitToLast 崩潰

嘗試加載新數據時 Firebase LimitToLast 崩潰

Helenr 2021-08-19 17:46:54
在將 20 個用戶發布到我的 ListView 后,我嘗試加載更多元素(此功能工作正常)但是當我滾動到 ListView 底部時,我想加載另外 20 個用戶,但它崩潰了。這是我到目前為止所做的過濾數據類private String oldestUserID;private void fetchData(DataSnapshot dataSnapshot) {    mList.clear();    for (DataSnapshot snapshot : dataSnapshot.getChildren()) {        oldestUserID = dataSnapshot.getKey();        userPojo = snapshot.getValue(UserPojo.class);        String email = userPojo.getEmail();        mList.add(email);    }    fetchSuccessListener.onListFetched(true);}public void refillListView(ListView listView) {    listView.setOnScrollListener(new AbsListView.OnScrollListener() {        @Override        public void onScrollStateChanged(AbsListView view, int scrollState) {            currentScrollState = scrollState;            isScrollCompleted();        }        @Override        public void onScroll(AbsListView view, int firstVisibleItem,                             int visibleItemCount, int totalItemCount) {            currentFirstVisibleItem = firstVisibleItem;            currentVisibleItemCount = visibleItemCount;            totalItem = totalItemCount;        }        private void isScrollCompleted() {            if (totalItem - currentFirstVisibleItem == currentVisibleItemCount                    && currentScrollState == SCROLL_STATE_IDLE) {                mDatabase.orderByKey().startAt(oldestUserID).limitToFirst(20).addListenerForSingleValueEvent(new ValueEventListener() {                    @Override                    public void onDataChange(DataSnapshot dataSnapshot) {                        fetchData(dataSnapshot);                    }                    @Override                    public void onCancelled(DatabaseError databaseError) {                    }                });            }        }    });}這就是它的工作方式,我使用一個界面來檢測我的數據何時完成獲取并通知我的適配器填充 ListView,這對我的前 20 個用戶工作正常,但是當我滾動到最后時,我希望添加列表新用戶(還有 20 個),但我收到了這個崩潰日志無法使用先前設置的限制調用 limitToLast 查詢!現在,這是我如何調用我的方法以獲取數據主Activity.class檢索數據時填充列表視圖的界面(工作正常)
查看完整描述

2 回答

?
一只斗牛犬

TA貢獻1784條經驗 獲得超2個贊

據我所知,你最初這樣做:


Query query = mRootDatabase.limitToFirst(20);

FilterData filterData  = new FilterData(query,this);

并FilterData接著做:


public FilterData(Query mQueryDatabase, Context context) {

    this.mQueryDatabase = mQueryDatabase;

    this.userPojo = new UserPojo();

    this.mContext = context;

}

接著:


mQueryDatabase.orderByKey().startAt(oldestUserID).limitToFirst(20).addListenerForSingleValueEvent(new ValueEventListener() {

    @Override

    public void onDataChange(DataSnapshot dataSnapshot) {

        fetchData(dataSnapshot);

    }


    @Override

    public void onCancelled(DatabaseError databaseError) {

        throw databaseError.toException(); // don't ignore errors

    }

});

在這一點上,如果我們將這些東西鏈接在一起,你有:


mRootDatabase

  .limitToFirst(20)

  .orderByKey()

  .startAt(oldestUserID)

  .limitToFirst(20)

  .addListenerForSingleValueEvent(

    ...

由于您limitToFirst(20)在那里兩次,它解釋了為什么您會收到錯誤消息。


我的直覺是,您想將查詢的根引用傳遞給FilterData,因此:


FilterData filterData  = new FilterData(mRootDatabase,this);

或者,您可以在 之外構建基本查詢(查詢的所有部分都是常量)FilterData:


Query query = mRootDatabase.orderByKey().limitToFirst(20);

然后在FilterData你只添加變量部分(startAt()子句):


mQueryDatabase.startAt(oldestUserID).addListenerForSingleValueEvent(new ValueEventListener() {

    @Override

    public void onDataChange(DataSnapshot dataSnapshot) {

        fetchData(dataSnapshot);

    }


    @Override

    public void onCancelled(DatabaseError databaseError) {

        throw databaseError.toException(); // don't ignore errors

    }

});


查看完整回答
反對 回復 2021-08-19
?
慕容708150

TA貢獻1831條經驗 獲得超4個贊

在這里,我完成了 Firebase-Chat-Pagination。檢查這個。它可能對你有幫助。


private void loadDataFirst() {

    mUserRefValueEventListener = mConversationRef.child(mLocation)

            .limitToLast(TOTAL_ITEM_EACH_LOAD)

            .orderByKey()

            .addValueEventListener(new ValueEventListener() {

                @Override

                public void onDataChange(DataSnapshot dataSnapshot) {

                    // It should be null when new meesage sent by own

                    mLastDataSnapshot = null;

                    if (dataSnapshot.exists()) {

                        mChatList.clear();

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

                            ChatResponse chatModel = readDataSnapshot.getValue(ChatResponse.class);

                            if (chatModel != null) {

                                mChatList.add(chatModel);

                            }

                            // We need First DataSnapshot for pagination

                            if (mLastDataSnapshot == null) {

                                mLastDataSnapshot = readDataSnapshot;

                            }


                        }

                        mView.onFetchMessagesSuccess(mChatList);

                    }

                }


                @Override

                public void onCancelled(DatabaseError databaseError) {


                }

            });


}


 public void loadMoreDataPagination() {


    if (mLastDataSnapshot != null && (mTotalCount == 0 || mView.getChatMessageCount() < mTotalCount)) {

        mUserRefValueEventListener = mConversationRef.child(mLocation)

                .orderByKey()

                .endAt(mLastDataSnapshot.getKey())

                .limitToLast(TOTAL_ITEM_EACH_LOAD)

                .addValueEventListener(new ValueEventListener() {

                    @Override

                    public void onDataChange(DataSnapshot dataSnapshot) {



                        if (dataSnapshot.exists()) {

                            mChatList.clear();

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

                                ChatResponse chatModel = readDataSnapshot.getValue(ChatResponse.class);

                                if (chatModel != null) {

                                    mChatList.add(chatModel);

                                }

                                // We need Last DataSnapshot for pagination while load more

                                if (mChatList.size() == 1) {

                                    mLastDataSnapshot = readDataSnapshot;

                                }

                            }

                            // One item duplicates from last list so need to Remove it

                            mChatList.remove(mChatList.size() - 1);

                            mView.onFetchLoadMoreSuccess(mChatList, mTotalCount);


                        }

                    }


                    @Override

                    public void onCancelled(DatabaseError databaseError) {

                        mView.hideLoading();

                    }

                });

    }

}


查看完整回答
反對 回復 2021-08-19
  • 2 回答
  • 0 關注
  • 162 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號