2

Ich arbeite an Q/A App. Ich habe erfolgreich Fragen von Firebase geladen. Aber ich kann keine Seitenumbrüche aus der Firebase-ähnlichen Datenbank anwenden. Und wie erkennt man, dass wir das Ende der Recycleransicht erreicht haben, damit die nächsten paar Fragen geladen werden können.Seitennummerierung in endloser Recycler-Ansicht mit Firebase

+0

Können Sie Ihren Code für Adapter veröffentlichen. –

Antwort

6

erkennen, dass wir Ende RecyclerView erreicht haben Sie diese Klasse EndlessRecyclerOnScrollListener.java

laden mehr nächste Frage verwenden können, sollten Sie in Question class wie Anzahl

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

Dann ein weiteres Feld definieren, wenn Sie laden Fragen von FireBase können Sie wie

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(); 
    } 
} 
tun

Here is my DEMO project

+0

Was ist die minimale API-Ebene, die von Ihrer Klasse unterstützt wird? –

+1

@RishabhMaurya von Level 1 –

+0

Ok, ich werde das implementieren und dann Sie benachrichtigen. –

0

enter image description here

Sie können Firebase Queries auf Ihre FirebaseRecyclerAdapter erstellen, mit startAt und limitToFirst Aufzeichnungen in Chargen zum Download bereit.

Die Seitengröße limitToFirst würde um und Ereignis wie ein Klick oder pull to refresh erhöht werden.

+0

Ich möchte die Recyclerview Fortschrittsbalken anzeigen, wenn der nächste Satz von festen Artikel von Firebase geladen wird. –

+0

Sie können das 'SwipeRefreshLayout' mit' setRefreshing' aufrufen/schließen. –

0

Um zu überprüfen, ob Sie den unteren Rand des RecyclerView erreicht haben, können Sie den onScrolled Listener wie unten verwenden. Die if-Bedingung ist hier wichtig und definiert, wann ein Benutzer den unteren Rand erreicht hat.

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; 
       } 
      } 
     }); 

Zweitens können Sie startAt und limitToFirst Methoden verwenden, um Fragen in Chargen zu erhalten, wie unten dargestellt:

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

ich eine Open-Source-App erstellt haben, die genau zeigt, wie es gemacht wird. Bitte schauen Sie: https://blog.shajeelafzal.com/2017/12/13/firebase-realtime-database-pagination-guide-using-recyclerview/

Verwandte Themen