简体   繁体   English

无限滚动视图 firebase 实时数据库错误

[英]Infinite scrollview firebase realtime database error

im trying to implement an infinite scroll on my listview to load 10 posts more after scroll down and must hold the last 10 on screen because i dont have a button to back to the previous list, managed to retrieve the data, but when i try to scroll down to retrieve the next 10, it crash and give this 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();
        }
    });
}

and this is the log after crash:这是崩溃后的日志:

java.lang.IllegalArgumentException: You must use startAt(String value), endAt(String value) or equalTo(String value) in combination with orderByKey(). java.lang.IllegalArgumentException:您必须将 startAt(String value)、endAt(String value) 或 equalTo(String value) 与 orderByKey() 结合使用。 Other type of values or using the version with 2 parameters is not supported不支持其他类型的值或使用带有 2 个参数的版本

My guess is that oldestPostId is null , which is not allowed.我的猜测是oldestPostIdnull ,这是不允许的。

You'll want to check for null before deciding to use oldestPostId :在决定使用null之前,您需要检查oldestPostId

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

Btw: Firebase Realtime Database now has a startAfter method , which means you won't be retrieving the same key twice.顺便说一句:Firebase 实时数据库现在有一个startAfter方法,这意味着您不会两次检索相同的密钥。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM