1

Mit der neuesten update to RecyclerView kann es jetzt wrap_content innerhalb einer NestedScrollView. Es gibt jedoch ein Verhalten, das nicht gut zu mir passt, und ich suche nach Antworten.Neueste RecyclerView-Verschachtelung in NestedScrollView mit ItemTouchHelper

Probleme 1: Die Verpackung berücksichtigt keine leeren Bereiche. Das bedeutet, wenn es leere Räume nach dem RecyclerView Inhalt, wird die Animation ziehen Sie das Element Mitte Bildschirm Clip wie hier dargestellt:

enter image description here

UPDATE: Gelöste Problem 1. Ich brauchte nur die layout_weight hinzufügen = Attribut "1" für den RecyclerView.

Problem 2: ähnlich Problem ein, wenn ein Element zu löschen, wird die RecyclerView wickelt sofort zu Beginn der Animation - was die Animation wie hier dargestellt Clip:

enter image description here

UPDATE: Problem 2 ist immer noch nicht gelöst, aber es ist nicht so auffällig wie zuvor. Wenn das Objekt entfernt wird, wird das Objekt nun an den Ansichtsanschluss geklammert, sodass es so aussieht, als ob der Bildschirm auf die neue Höhe springt, während die Animation unterhalb des Ansichtsanschlusses angezeigt wird.

Problem 3: Wenn ich ein neues Element hinzufüge, möchte ich bis zum Ende der ScrollView scrollen. Beim Ausführen des folgenden Codes in meinem Add-Ereignis springt das Scrollen jedoch sofort zum aktuellen Ende der Bildlaufansicht. Gibt es einen Rückruf für "nachdem der Artikel eingefügt wurde"?

public void addItem(T item) { 
    items.add(item); 
    notifyItemInserted(items.size() - 1); 
    scroll.fullScroll(View.FOCUS_DOWN) 
} 

enter image description here

UPDATE: Problem 3 noch nicht behoben, aber ich fand eine Abhilfe, die die Reihenfolge wie folgt umkehren:

layoutManager.setReverseLayout(true); 
layoutManager.setStackFromEnd(true); 

Und dann den Code unten, wenn neue Artikel hinzufügen. Auf diese Weise funktioniert das Scrollen immer unabhängig von der Höhe.

nestedScrollView.fullScroll(View.FOCUS_UP); 

Der Artikel zitierte:

Beachten Sie, dass obwohl RecyclerView seine Kinder animiert, ist es nicht seine eigenen Grenzen Änderungen animieren. Wenn Sie die RecyclerView-Grenzen bei ihrer Änderung animieren möchten, können Sie die Transition-APIs verwenden.

Nun brauche ich nicht, die Grenzen zu animieren, aber ich will es die die Sichtöffnung (I match_parent in diesem Fall verwenden, können nicht schnappen und zu füllen, wie ich einige statische Ansichten über den Recycler Blick). So lösen Problem 1.

Ich möchte etwas tun, bevor die Grenzen geändert werden. Beispiel: Beim Entfernen des Elements animieren Sie das Entfernen und wenden dann die gebundene Änderung an. So lösen Problem 2.

Umgekehrt möchte ich einige Dinge tun, wenn die Grenzen bereits geändert haben. Beispiel: Wenn Sie ein neues Element hinzufügen, wenden Sie zuerst die neue Grenze an und starten Sie dann die Bildlaufanimation. So lösen Problem 3.

Irgendeine Idee, wie ich das erreichen kann?

Antwort

0

Ich habe eine bessere Lösung für das, was ich wollte, gefunden. Viel einfacher als zu versuchen herauszufinden, wie der neue LinearLayoutManager den Inhalt umschließt.

Statt diese aufweist:

<NestScrollView> 
    <LinearLayout> 
    <View></View> 
    <View></View> 
    <RecyclerView></RecyclerView> 
    </LinearLayout> 
</NestScrollView> 

ging ich nur mit dem Recycler allein und verwalten den Header innerhalb des RecyclerView selbst:

<FrameLayout> 
    <RecyclerView></RecyclerView> 
</FrameLayout> 

Es ist so viel einfacher, jetzt zu verwalten, wie ich setzen kann jede Ansicht über oder unter den Gegenständen.

Verwenden Sie diese Lösung hier: Link

Verwandte Themen