我在我的应用程序中使用了带有微调器的回收站视图。它加载有关物理,化学等不同主题的帖子。微调框包含物理和其他主题。微调器中的默认项目是“所有主题”,其中加载了所有问题。我正在使用无尽的回收器视图以在结束时加载新数据。在请求时,它运行良好,并且在更改微调器中的主题之后,新列表也运行良好,但是此后,当我第三次更改微调器中的主题时,新列表仅包含初始数据,并且不会加载当我滚动到末尾时,会获得更多数据。
这是我的演示者代码:
public void getPosts(final String currentSubject) {
postsList = new ArrayList<>();
view.startRecyclerAdapter(postsList);
view.showProgressBar();
view.hideNoPostsText();
view.notifyAdapter();
OnCompleteListener postsListener = new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull final Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (DocumentSnapshot document : task.getResult()) {
getPostData(document);
}
if (postsList.size() == 0) {
view.onNoPostsExists();
} else {
view.onDataFound();
}
if(task.getResult().size() > 0 ) {
lastVisible = task.getResult().getDocuments().get(task.getResult().size() - 1);
lastPosition = task.getResult().size() - 1;
}
RecyclerView.OnScrollListener onScrollListener = new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
isScrolling = true;
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
LinearLayoutManager linearLayoutManager = ((LinearLayoutManager) recyclerView.getLayoutManager());
int firstVisibleItemPosition = linearLayoutManager.findFirstVisibleItemPosition();
int visibleItemCount = linearLayoutManager.getChildCount();
int totalItemCount = linearLayoutManager.getItemCount();
if (isScrolling && (firstVisibleItemPosition + visibleItemCount == totalItemCount) && !isLastItemReached) {
isScrolling = false;
OnCompleteListener secondQueryCompleteListener = new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> t) {
if (t.isSuccessful()) {
for (DocumentSnapshot d : t.getResult()) {
getPostData(d);
}
view.notifyAdapter();
if(t.getResult().size() > 0) {
lastVisible = t.getResult().getDocuments().get(t.getResult().size() - 1);
lastPosition += 5;
}
Log.v("LoggingPosition", "last position is : " + lastPosition);
if (t.getResult().size() < limit) {
isLastItemReached = true;
}
}
}
};
if (currentSubject.equals("كل المواد")) {
Query nextQuery = fireStorePosts.orderBy("date", Query.Direction.DESCENDING)
.startAfter(lastVisible).limit(limit);
nextQuery.get().addOnCompleteListener(secondQueryCompleteListener);
}
else {
Query nextQuery = fireStorePosts.whereEqualTo("subject", currentSubject)
.orderBy("date", Query.Direction.DESCENDING).startAfter(lastVisible).limit(limit);
nextQuery.get().addOnCompleteListener(secondQueryCompleteListener);
}
}
}
};
view.setOnScrollListener(onScrollListener);
} else {
Log.v("TAG", "failed");
}
}
};
if (currentSubject.equals("كل المواد")) {
firstQuery = fireStorePosts.orderBy("date", Query.Direction.DESCENDING).limit(limit);
firstQuery.get().addOnCompleteListener(postsListener);
} else {
firstQuery = fireStorePosts.whereEqualTo("subject", currentSubject)
.orderBy("date", Query.Direction.DESCENDING).limit(limit);
firstQuery.get().addOnCompleteListener(postsListener);
}
}
这是我认为的相关方法:
@Override
public void notifyAdapter() {
recyclerAdapter.notifyDataSetChanged();
}
@Override
public void setOnScrollListener(RecyclerView.OnScrollListener onScrollListener) {
recyclerView.addOnScrollListener(onScrollListener);
}