如何在Firebase官方的Friendly Eats应用程序中特别在Firestore中实现分页?

时间:2018-12-13 17:37:00

标签: android android-recyclerview google-cloud-firestore

我在搜索Web方面以及stackoverflow上都进行了很多搜索,但是我的问题还是一样。我做了很多尝试,但是没用。

经过大量尝试,我编写了这段代码,但是它只能单向运行。我的意思是我可以向上滚动并且分页效果很好(带有一些闪烁:)),但是它不允许我向上滚动。我的意思是新项目不断增加,但是我无法浏览recyclerview的先前项目。

这是我的代码

        mQuery = mFirestore.collection("artists")
            .orderBy(Artist.FIELD_ARTISTNAME, Query.Direction.ASCENDING)
            .limit(LIMIT);

    fillList(mQuery);

    mQuery.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            lastVisible = task.getResult().getDocuments().get(task.getResult().size() - 1);
            Toast.makeText(MainActivity.this, "first page loaded", Toast.LENGTH_SHORT).show();

            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);
                    int firstVisibleItem = ((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstVisibleItemPosition();
                    int visibleItemCount = linearLayoutManager.getChildCount();
                    int totalItemCount = linearLayoutManager.getItemCount();

                    Toast.makeText(MainActivity.this, firstVisibleItem + " and " + visibleItemCount + " and " + totalItemCount, Toast.LENGTH_SHORT).show();

                    if (isScrolling && (firstVisibleItem + visibleItemCount == totalItemCount) && !isLastItemReached) {

                        isScrolling = false;

                        mQuery = mFirestore.collection("artists")
                                .orderBy(Artist.FIELD_ARTISTNAME, Query.Direction.ASCENDING)
                                .startAfter(lastVisible)
                                .limit(LIMIT);

                        mQuery.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                            @Override
                            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                                fillList(mQuery);
                                mAdapter.notifyDataSetChanged();

                                lastVisible = task.getResult().getDocuments().get(task.getResult().size() - 1);
                                Toast.makeText(MainActivity.this, "next page loaded", Toast.LENGTH_SHORT).show();

                                if (task.getResult().size() < LIMIT) {
                                    isLastItemReached = true;
                                }
                            }

                        });
                    }
                }
            };
            mRestaurantsRecycler.addOnScrollListener(onScrollListener);
        }
    });

这是fillList函数的代码

    public void fillList(Query myQuery) {
    // RecyclerView
    mAdapter = new ArtistAdapter(myQuery, this) {
        @Override
        protected void onDataChanged() {
            // Show/hide content if the query returns empty.
            if (getItemCount() == 0) {
                mRestaurantsRecycler.setVisibility(View.GONE);
                mEmptyViewText.setText(getResources().getString(R.string.message_no_results));
                mEmptyViewExit.setTag("noRecords");
                mEmptyViewExit.setText(getResources().getString(R.string.no_records_button));
                mEmptyView.setVisibility(View.VISIBLE);
            } else {
                mRestaurantsRecycler.setVisibility(View.VISIBLE);
                mEmptyView.setVisibility(View.GONE);
            }

        }

        @Override
        protected void onError(FirebaseFirestoreException e) {
            // Show a snackbar on errors
            Snackbar.make(findViewById(android.R.id.content),
                    "Error: check logs for info.", Snackbar.LENGTH_LONG).show();
        }
    };

    mRestaurantsRecycler.setLayoutManager(new LinearLayoutManager(this));
    mRestaurantsRecycler.setAdapter(mAdapter);
}

0 个答案:

没有答案