Die meisten Antworten gehen davon aus, dass der RecyclerView
einen LinearLayoutManager
, oder GridLayoutManager
verwendet, oder sogar StaggeredGridLayoutManager
, oder dass das Scrollen vertikal oder horizontal ist, aber niemand hat eine wirklich allgemeine Antwort gepostet.
Die Verwendung des ViewHolder
-Adapters ist offensichtlich keine gute Lösung. Ein Adapter kann von mehr als 1 RecyclerView
verwendet werden. Er "passt" ihren Inhalt an. Der RecyclerView (der die Klasse ist, die dafür verantwortlich ist, was dem Benutzer momentan angezeigt wird, und nicht der Adapter, der nur dafür verantwortlich ist, Inhalte für den RecyclerView
bereitzustellen) sollte Ihr System benachrichtigen, dass mehr Elemente (zum Laden) benötigt werden.
Hier ist meine Lösung, die nichts anderes als die abstrahierten Klassen des RecyclerView verwendet (RecyclerView.LayoutManager und RecyclerView.Adapter):
/**
* Listener, der zurückruft, wenn das letzte Element des Adapters für den Benutzer sichtbar ist.
* Es sollte dann an der Zeit sein, mehr Elemente zu laden.
**/
public abstract class LastItemListener extends RecyclerView.OnScrollListener {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
// Initialisierung
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
RecyclerView.Adapter adapter = recyclerView.getAdapter();
if (layoutManager.getChildCount() > 0) {
// Berechnungen
int indexOfLastItemViewVisible = layoutManager.getChildCount() -1;
View lastItemViewVisible = layoutManager.getChildAt(indexOfLastItemViewVisible);
int adapterPosition = layoutManager.getPosition(lastItemViewVisible);
boolean isLastItemVisible = (adapterPosition == adapter.getItemCount() -1);
// Überprüfung
if (isLastItemVisible)
onLastItemVisible(); // Rückruf
}
}
/**
* Hier sollten Sie mehr Elemente laden, weil der Benutzer das letzte Element der Liste sieht.
* Tipp: Sie sollten einen booleschen Wert zur Klasse hinzufügen,
* damit die Methode {@link #onLastItemVisible()} nur einmal ausgelöst wird
* und nicht jedes Mal, wenn der Benutzer den Bildschirm berührt ;)
**/
public abstract void onLastItemVisible();
}
// --- Beispiel für die Verwendung ---
myRecyclerView.setOnScrollListener(new LastItemListener() {
public void onLastItemVisible() {
// beginnen Sie hier mit dem Laden weiterer Elemente.
}
}