0

Ich habe eine ViewPager, die eine RecyclerView für jede Seite verwendet und ViewItem Zeilen über Seiten verteilt. Dementsprechend teile ich eine einzige RecyclerViewPool zwischen ihnen. Jedoch lädt die ViewPager jede RecyclerView, ob es die Seite auf dem Bildschirm ist oder nicht. Gibt es eine Möglichkeit, dem RecyclerView anzuzeigen, dass alle seine Elemente im Offscreen angezeigt werden und seine Ansichten auf Recycler zurückgesetzt werden?Android RecyclerView plus ViewPager

Mein Gefühl ist, dass Subklassen LinearLayoutManager und zwingende seine onLayoutChildren Methode ist der Weg zu gehen, aber ich habe nicht viel Erfahrung mit LayoutManager und würde einige Hinweise mögen.

+0

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

+0

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

+0

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

Antwort

0

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 ...

Verwandte Themen