簡體   English   中英

無限滾動視圖 firebase 實時數據庫錯誤

[英]Infinite scrollview firebase realtime database error

我試圖在我的列表視圖上實現無限滾動以在向下滾動后加載 10 個帖子,並且必須在屏幕上按住最后 10 個帖子,因為我沒有返回上一個列表的按鈕,設法檢索數據,但是當我嘗試向下滾動以檢索下一個 10,它崩潰並給出此錯誤。

SearchRef = FirebaseDatabase.getInstance().getReference().child("Normas");


    if (user != null) {
        getThreads();
        threadsListView.setOnScrollListener(new AbsListView.OnScrollListener() {
            private int currentVisibleItemCount;
            private int currentScrollState;
            private int currentFirstVisibleItem;
            private int totalItem;
            private LinearLayout lBelow;


            @Override
            public void onScrollStateChanged (AbsListView view,int scrollState){
                // TODO Auto-generated method stub
                this.currentScrollState = scrollState;
                this.isScrollCompleted();
            }

            @Override
            public void onScroll (AbsListView view,int firstVisibleItem,
                                  int visibleItemCount, int totalItemCount){
                // TODO Auto-generated method stub
                this.currentFirstVisibleItem = firstVisibleItem;
                this.currentVisibleItemCount = visibleItemCount;
                this.totalItem = totalItemCount;


            }

            private void isScrollCompleted () {
                if (totalItem - currentFirstVisibleItem == currentVisibleItemCount
                        && this.currentScrollState == SCROLL_STATE_IDLE) {
                    /** To do code here*/
                    SearchRef.orderByKey().startAt(oldestPostId).limitToLast(10).addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            for (DataSnapshot child : dataSnapshot.getChildren()) {
                                MessageThread messageThread = child.getValue(MessageThread.class);
                                if (messageThread != null) {
                                    oldestPostId = child.getKey();
                                    messageThread.thread_id = child.getKey();
                                    Log.d(TAG, "onDataChange: " + messageThread.toString());
                                }
                            }
                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {

                        }
                    });

                }
            };

        });
    }



public void getThreads() {
    SearchRef.limitToLast(10).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Query ordenar = mDatabase.child("Normas").orderByChild("countthreads");
            threadsList.clear();
            for (DataSnapshot messageThreadSnapshot : dataSnapshot.getChildren()) {
                MessageThread messageThread = messageThreadSnapshot.getValue(MessageThread.class);
                if (messageThread != null) {
                    dataSnapshot.getChildrenCount();
                    messageThread.thread_id = messageThreadSnapshot.getKey();
                    Log.d(TAG, "onDataChange: " + messageThread.toString());
                }
                threadsList.add(messageThread);
            }
            threadsAdapter = new ThreadsAdapter(ThreadsActivity.this, R.layout.threads_listview, threadsList, ThreadsActivity.this, ordenar);
            Collections.reverse(threadsList);
            threadsListView.setAdapter(threadsAdapter);

        }
        @Override
        public void onCancelled(DatabaseError databaseError) {
            Toast.makeText(ThreadsActivity.this, "ThreadsActivity: " + databaseError.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });
}

這是崩潰后的日志:

java.lang.IllegalArgumentException:您必須將 startAt(String value)、endAt(String value) 或 equalTo(String value) 與 orderByKey() 結合使用。 不支持其他類型的值或使用帶有 2 個參數的版本

我的猜測是oldestPostIdnull ,這是不允許的。

在決定使用null之前,您需要檢查oldestPostId

Query query = SearchRef.orderByKey().limitToLast(10);
if (oldestPostId != null) {
  query = query.startAt(oldestPostId);
}
query.addListenerForSingleValueEvent(new ValueEventListener() {
  ...

順便說一句:Firebase 實時數據庫現在有一個startAfter方法,這意味着您不會兩次檢索相同的密鑰。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM