我可以显示FireBase数据库中的所有书籍,但是一旦我使用分页加载10本书,我的屏幕上没有显示任何内容,我的Logcut中没有错误。
请帮助我了解我的代码中的错误。
private boolean isLoading;
int mPageEndOffset = 0;
int mPageLimit = 10;
//OnCreate
listAdapter = new FeedListAdapter(getActivity(), feedItems);
listView.setAdapter(listAdapter);
listView.setOnItemClickListener(myClickListener);
listView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView absListView, int i) {
}
@Override
public void onScroll(AbsListView absListView, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
if (mPageEndOffset != 0) {
int lastInScreen = firstVisibleItem + visibleItemCount;
if ((lastInScreen == totalItemCount) && !(isLoading)) {
loadData();
}
}
}
});
//Load More Data from FireBase Database
private void loadData() {
ref.orderByChild("date_creation").limitToLast(mPageLimit).startAt(mPageEndOffset).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
isLoading = true;
for (DataSnapshot dataSnap : dataSnapshot.getChildren()) {
Book valueBook = dataSnap.getValue(Book.class);
keyId = dataSnap.getKey();
String titreLivreToDisplay = valueBook.getNom_livre();
String descLivreToDisplay = valueBook.getDesc_livre();
String prixLivreToDisplay = valueBook.getPrix_livre();
String timeToDisplay = valueBook.getDate_creation();
String filePathToDiplay = valueBook.getChemin_image();
String villeToDisplay = valueBook.getVille_livre();
String typeAnnToDisplat = valueBook.getType_annonce_selected();
String catAnnToDisplay = valueBook.getCat_selected();
}
valueBook.setNom_livre(titreLivreToDisplay);
valueBook.setDesc_livre(descLivreToDisplay);
valueBook.setPrix_livre(prixLivreToDisplay);
valueBook.setDate_creation(timeToDisplay);
valueBook.setChemin_image(filePathToDiplay);
valueBook.setVille_livre(villeToDisplay);
valueBook.setType_annonce_selected(typeAnnToDisplat);
valueBook.setCat_selected(catAnnToDisplay);
valueBook.setKeyIdNode(keyId);
feedItems.add(valueBook);
}
if (feedItems != null && feedItems.size() != 0) {
Collections.reverse(feedItems);
listAdapter.notifyDataSetChanged();
mPageEndOffset += mPageLimit;
isLoading = false;
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
String message = "Server error. Refresh page";
Toast.makeText(getActivity(), message, Toast.LENGTH_SHORT).show();
}
});
}
答案 0 :(得分:0)
您的startAt
字段使用了错误的date_creation
值。 startAt
值的格式应为date_creation
。(例如现在您有startAt=5
,但date_creation=1499705022735
并且无法进行比较。您应该startAt=1499705022735
)。
尝试使用以下内容:
private long offset = 0;
private int limit = 10;
private boolean isLastPage = false;
if (!isLastPage) loadData(offset, limit);
//Condition for loaded data
if (books.size() > 0) {
if (books.size() < limit - 1) isLastPage = true;
else {
offset = books.get(books.size() - 1).getDate_creation();
books = books.subList(0, books.size() - 1);
}
} else isLastPage = true;
//for your firebase reference
ref.orderByChild("createdAt").startAt(offset).limitToFirst(limit);
保留上次加载的列表项的字段date_creation
的值,这将是您的字段startAt
,用于下一个请求。
它看起来不太好,但这是Firebase
中这种情况的唯一可行解决方案,并且可行。