So, hier ist eine Unterklasse von LinearLayoutManager
, die die Art und Weise arbeitet die ich beschrieben:
public class PageVisibleLinearLayoutManager extends LinearLayoutManager {
public PageVisibleLinearLayoutManager(Context context) {
super(context);
}
public PageVisibleLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
super(context, orientation, reverseLayout);
}
public PageVisibleLinearLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
private boolean pageVisible = true;
void setPageVisible(boolean pageVisible) {
boolean change = (this.pageVisible != pageVisible);
this.pageVisible = pageVisible;
if(change) requestLayout();
}
@Override
public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
if(pageVisible) {
super.onLayoutChildren(recycler, state);
} else {
removeAndRecycleAllViews(recycler);
}
}
}
Es funktioniert gut und seine Ansichten gibt auf Wunsch. Wie bereits erwähnt, ist es wichtig, angrenzende Seiten als auf dem Bildschirm zu markieren (und ich weiß wirklich nicht, warum setOffscreenPageLimit
die Anzahl der geladenen Seiten nicht wie erwartet begrenzt). Meine vorherige Lösung war, ViewStub
zu verwenden und eine Seite nur aufzublasen, wenn sie auf dem Bildschirm oder nebenan war. Die Layout-Manager-Methode ist beim ersten Wechsel zu einer unbelasteten Seite etwas schneller, aber ViewStub
hat den Vorteil, dass die Seiten nach dem Laden im Speicher bleiben (was das anschließende Scrollen glatter macht), also entschied ich mich, dabei zu bleiben.
Danke euch allen. Nächste Frage ...
ViewPager erstellt die angrenzende Seite, bevor sie sichtbar ist, da zwei benachbarte Seiten angezeigt werden müssen, wenn der Benutzer zwischen ihnen wischt. So sind die Ansichten wirklich erforderlich, auch wenn sie für eine Zeit außerhalb des Bildschirms sind. Seiten, die nicht an die aktuelle Seite angrenzen, werden nicht erstellt und werden zerstört. – dsh
Aus irgendeinem Grund, egal was ich 'setOffscopePageLimit' eingestellt habe, lädt der ViewPager immer 6 Seiten. Meine vorherige Lösung bestand darin, die 'RecyclerView's in' ViewStub' zu setzen und die angrenzenden Seiten aufzublähen, wenn eine mittlere Seite gescrollt wurde. Das funktioniert eigentlich ganz gut, aber ich dachte, vielleicht könnte ich etwas mehr Speed daraus machen. – NewEndian
Interessant. Die App, mit der ich arbeite, hat einen ViewPager mit 3 Tabs. Ich war mir der Methode setOffscreenPageLimit nicht bewusst, aber ich habe festgestellt, dass die aktuellen und angrenzenden Registerkarten vorhanden sind und die andere nicht, da die Registerkarten geändert werden. (Ich hatte kürzlich Druckanweisungen in meiner benutzerdefinierten Ansicht, um den Lebenszyklus davon zu beobachten/zu debuggen. So weiß ich, wann es aus dem Fenster entfernt wurde; irgendwann hatten wir Debug-Drucke im Lebenszyklus der Fragmente, während wir daran arbeiteten) – dsh