Pagination in endless recycler view with firebase

前端 未结 3 1172
清酒与你
清酒与你 2021-02-02 04:15

I am working on Q/A app . I have successfully loaded questions from firebase . But I am not able to apply pagination from Firebase like database . And how to recognize that we h

相关标签:
3条回答
  • 2021-02-02 04:48

    To recognize that we have reached end of RecyclerView you can use this class EndlessRecyclerOnScrollListener.java

    To load more next question, you should define one more field in Question class like number

    public class Question {
        private int number; // it must unique and auto increase when you add new question
        ...
    }
    

    Then when you load questions from FireBase you can do like

    public class MainActivity extends AppCompatActivity {
        private static final int TOTAL_ITEM_EACH_LOAD = 10;
        private DatabaseReference mDatabase;
        final List<Question> questionList = new ArrayList<>();
    
        private int currentPage = 0;
    
        private RecyclerView recyclerView;
        private RecyclerViewAdapter mAdapter; 
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            ...
            // init and set layout manager for your RecyclerView
            ...
            mAdapter = new RecyclerViewAdapter(questionList);
            recyclerView.setAdapter(mAdapter);
            recyclerView.setOnScrollListener(new EndlessRecyclerOnScrollListener(mLayoutManager) {
                @Override
                public void onLoadMore(int current_page) { // when we have reached end of RecyclerView this event fired
                    loadMoreData();
                }
            });
            loadData(); // load data here for first time launch app
        }
    
        private void loadData() {
            // example
            // at first load : currentPage = 0 -> we startAt(0 * 10 = 0)
            // at second load (first loadmore) : currentPage = 1 -> we startAt(1 * 10 = 10)
            mDatabase.child("questions")
                    .limitToFirst(TOTAL_ITEM_EACH_LOAD)
                    .startAt(currentPage*TOTAL_ITEM_EACH_LOAD)
                    .orderByChild("number")
                    .addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            if(!dataSnapshot.hasChildren()){
                                Toast.makeText(MainActivity.this, "No more questions", Toast.LENGTH_SHORT).show();
                                currentPage--;
                            }
                            for (DataSnapshot data : dataSnapshot.getChildren()) {
                                Question question = data.getValue(Question.class);
                                questionList.add(question);
                                mAdapter.notifyDataSetChanged();
                            }
                        }
    
                       @Override public void onCancelled(DatabaseError databaseError) {}});
        }
    
        private void loadMoreData(){
            currentPage++;
            loadData();
        }
    }
    

    Here is my DEMO project

    0 讨论(0)
  • 2021-02-02 04:48

    To check whether you have reached the bottom of the RecyclerView, you can use the onScrolled listener as below, the if condition here is important and it is defining when a user has reached to the bottom.

    mRV.addOnScrollListener(new RecyclerView.OnScrollListener() {
    
                @Override
                public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                    super.onScrolled(recyclerView, dx, dy);
    
                    mTotalItemCount = mLayoutManager.getItemCount();
                    mLastVisibleItemPosition = mLayoutManager.findLastVisibleItemPosition();
    
                    if (!mIsLoading && mTotalItemCount <= (mLastVisibleItemPosition + mPostsPerPage)) {
                        getUsers(mAdapter.getLastItemId());
                        mIsLoading = true;
                    }
                }
            });
    

    Secondly, you can use startAt and limitToFirst methods to get questions in batches as shown below:

    query = FirebaseDatabase.getInstance().getReference()
                        .child(Consts.FIREBASE_DATABASE_LOCATION_USERS)
                        .orderByKey()
                        .startAt(nodeId)
                        .limitToFirst(mPostsPerPage);
    

    I have created an open source app that shows exactly how it is done. Please have a look: https://blog.shajeelafzal.com/2017/12/13/firebase-realtime-database-pagination-guide-using-recyclerview/

    0 讨论(0)
  • 2021-02-02 04:49

    You can create Firebase Queries to your FirebaseRecyclerAdapter, using startAt and limitToFirst to download records in batches.

    The limitToFirst page size would be increased by and event, such as a click or a pull to refresh.

    0 讨论(0)
提交回复
热议问题