[英]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 個參數的版本
我的猜測是oldestPostId
是null
,這是不允許的。
在決定使用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.