2016-08-03 10 views
0

Ich habe einen RecyclerView, der meine Liste der ViewHolder-Elemente enthält. Wenn ein Benutzer ein Element berührt, wird sein Layout/Ansicht erweitert, um weitere Details anzuzeigen. Ziemlich Standard-Zeug und funktioniert gut ... außer in dieser einen Situation:RecyclerView scrollt nicht automatisch zum erweiterten ViewHolder-Element

Wenn der Benutzer zum letzten Element in der Liste scrollt, dann berührt es, dass Element an Ort und Stelle außerhalb der Ansicht erweitert. Mit anderen Worten, wenn das Element erweitert wird, wird das untere Ende der Liste erweitert, aber die Liste wird nicht automatisch gescrollt, um das gesamte erweiterte Element "auf dem Bildschirm" oder "in Sicht" innerhalb der Grenzen der RecyclerView zu behalten.

Ich habe RecyclerView.scrollToPosition() an die letzte Position in der Liste versucht, aber die Liste wird nicht verschoben.

Der Benutzer kann manuell die Liste scrollen und das volle erweiterte Element in Sicht zu bringen, aber ich möchte es automatisch geschehen.

Gedanken?

Edit: Ich weiß nicht, ob dies die Dinge beeinflusst, oder nicht, aber die Liste ist bereits manuell zum Ende der Liste gescrollt, so dass es scheint, als wäre es redundant, programmatisch zu der gleichen Position zu blättern. Im Wesentlichen versuche ich, die Bildlaufposition in der Liste zu aktualisieren, um den gesamten endgültigen Listeneintrag in den Blick zu bekommen.

+0

Ich habe auch versucht, die LinearLayoutManager.scrollToPosition() -Methode zu verwenden, aber ich bekomme das gleiche Ergebnis. – alpartis

Antwort

2

Ich war fast dort mit der Verwendung der LinearLayoutManager Scroll-Methode. Die Lösung für mich war, LinearLayoutManager.scrollToPositionWithOffset() zu verwenden, während die zusätzliche Größe der erweiterten Ansicht als Offset bereitgestellt wurde.

int distanceInPixels; 
View firstVisibleChild = recyclerView.getChildAt(0); 
int itemHeight = firstVisibleChild.getHeight(); 
int currentPosition = recyclerView.getChildAdapterPosition(firstVisibleChild); 
int p = Math.abs(position - currentPosition); 
if (p > 5) distanceInPixels = (p - (p - 5)) * itemHeight; 
else  distanceInPixels = p * itemHeight; 
layoutMgr.scrollToPositionWithOffset(position, distanceInPixels); 
+0

Hallo, können Sie bitte ein Beispiel teilen. Ich habe 6-7 Stunden für dieses Problem verschwendet. –

0

Verwenden Sie "max_size - 1" als Positionsargument innerhalb der recyclerView.scrollToPosition() Methode. Hier ist max_size die Anzahl der Elemente in Ihrer Liste.

+0

Wie ich im ursprünglichen Post gesagt habe, habe ich versucht, zur letzten Position in der Liste zu scrollen, d. H. .scrollToPosition (max_size - 1). Übrigens habe ich auch versucht, einen Index über das Ende der Liste zu scrollen, d. H. .scrollToPosition (max_size) unter Verwendung Ihrer Terme. – alpartis

+0

Es funktioniert tatsächlich für mich. Anscheinend können Sie die Rolle nicht überschreiten, um über die wirklichen Grenzen des Adapters hinauszugehen ... Danke! –