Я пытаюсь загрузить больше элементов после того, как мои 20 пользователей были опубликованы в моем ListView (эта функция работает нормально), но когда я прокручиваю до конца ListView, я хочу загрузить еще 20 пользователей, но происходит сбой.
Это то, что я сделал до сих пор
FilterData.class
private String oldestUserID;
private void fetchData(DataSnapshot dataSnapshot) {
mList.clear();
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
oldestUserID = dataSnapshot.getKey();
userPojo = snapshot.getValue(UserPojo.class);
String email = userPojo.getEmail();
mList.add(email);
}
fetchSuccessListener.onListFetched(true);
}
public void refillListView(ListView listView) {
listView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
currentScrollState = scrollState;
isScrollCompleted();
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
currentFirstVisibleItem = firstVisibleItem;
currentVisibleItemCount = visibleItemCount;
totalItem = totalItemCount;
}
private void isScrollCompleted() {
if (totalItem - currentFirstVisibleItem == currentVisibleItemCount
&& currentScrollState == SCROLL_STATE_IDLE) {
mDatabase.orderByKey().startAt(oldestUserID).limitToFirst(20).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
fetchData(dataSnapshot);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
});
}
Вот как это работает, я использую интерфейс, чтобы определить, когда мои данные заканчивают выборку, и уведомить мой адаптер о заполнении ListView, который работает нормально с моими первыми 20 пользователями, но когда я прокручиваю до конца, я хочу список для добавления новых пользователей (еще 20), но я получил этот крашлог
Невозможно вызвать limitToLast для запроса с ранее установленным пределом!
Теперь вот как я вызываю мои методы для получения данных
MainActivity.class
Интерфейс для заполнения списка при получении данных (работает нормально)
@Override
public void onListFetched(boolean fetched) {
if(fetched){
mUserListView.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
}
и это, чтобы просто знать, когда пользователь прокрутил и должен загрузить еще 20 пользователей
filterData.refillListView(mUserListView);
То, что я пытаюсь сделать выше, это получить последний идентификатор пользователя в моей базе данных, чтобы начать запрашивать 20 новых пользователей после последнего запроса, чтобы я мог загрузить еще 20.
Вот запрос, который я использую, чтобы получить первых 20 пользователей
mRootDatabase = FirebaseDatabase.getInstance().getReference().child("Usuarios");
query = mRootDatabase.limitToFirst(20);
Структура базы данных Firebase выглядит следующим образом
![Firebase Database](https://i.stack.imgur.com/c3aYg.jpg)
Редактировать: ошибка Logcat указывает на эту строку
mDatabase.orderByKey().startAt(oldestUserID).limitToFirst(20).....
Спасибо за любую помощь!
Редактировать: фрагмент
public void refillListView() {
mQueryDatabase.orderByKey().startAt(oldestUserID).limitToFirst(20).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
fetchData(dataSnapshot);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
где private Query mQueryDatabase;
передается моим конструктором
public FilterData(Query mQueryDatabase, Context context) {
this.mQueryDatabase = mQueryDatabase;
this.userPojo = new UserPojo();
this.mContext = context;
}
и заполнено так
Query query = mRootDatabase.limitToFirst(20);
FilterData filterData = new FilterData(query,this);
Старейший идентификатор пользователя извлекается из fetchData(dataSnapshot);
Где fetchData
private void fetchData(DataSnapshot dataSnapshot) {
mList.clear();
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
oldestUserID = snapshot.getKey();
userPojo = snapshot.getValue(UserPojo.class);
String email = userPojo.getEmail();
mList.add(email);
}
fetchSuccessListener.onListFetched(true);
}