Pagination in endless recycler view with firebase

前端 未结 3 1174
清酒与你
清酒与你 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 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

提交回复
热议问题