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



im试图在我的listview上实现无限滚动,以便在向下滚动后再加载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.IollegalArgumentException:必须将startAt(字符串值(、endAt(String值(或equalTo(字符串值。不支持其他类型的值或使用具有2个参数的版本

我的猜测是oldestPostId就是null,这是不允许的。

在决定使用oldestPostId:之前,您需要检查null

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

顺便说一句:Firebase实时数据库现在有一个startAfter方法,这意味着你不会两次检索同一个密钥。

相关内容

最新更新