Я пытаюсь реализовать бесконечную прокрутку в моем списке, чтобы загрузить еще 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: You must use startAt(String value), endAt(String value) or equalTo(String value) in combination with orderByKey(). Other type of values or using the version with 2 parameters is not supported




Я предполагаю, что oldestPostId - это null, что недопустимо.
Вы захотите проверить наличие null, прежде чем принимать решение об использовании oldestPostId:
Query query = SearchRef.orderByKey().limitToLast(10);
if (oldestPostId != null) {
query = query.startAt(oldestPostId);
}
query.addListenerForSingleValueEvent(new ValueEventListener() {
...
Кстати: в базе данных Firebase Realtime теперь есть startAfter метод, что означает, что вы не будете получать один и тот же ключ дважды.
Похоже, что oldestPostId никогда не устанавливается. Я рекомендую выполнить код в отладчике и убедиться, что строка, которую вы ожидаете установить для oldestPostId, действительно работает так, как вы ожидаете.
@FrankvanPuffelen Yeey с моей стороны для метода startAfter ()?
Привет, Фрэнк !, я отредактировал свой код с вашим предложением, теперь не выдает никаких ошибок, но после прокрутки вниз он просто перезагружает тот же список.