使用Android Firebase进行分页

时间:2017-06-06 10:01:15

标签: android listview firebase pagination firebase-realtime-database

我可以显示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();

            }
        });
    }

1 个答案:

答案 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中这种情况的唯一可行解决方案,并且可行。

相关问题