Im März 2014 hat Google die 19.1 Version seiner Android Support v4 Library veröffentlicht, zusammen mit dem SwipeRefreshLayout.
Das SwipeRefreshLayout ist die neue Art und Weise wie Google einen sogenannten “pull to refresh” implementiert hat / für die Zukunft möchte.
Die Google Now App hat diesen SwipeRefreshLayout bereits implementiert, andere Google Apps wie Google+ (G+) haben scheinbar noch eine andere Library, denn das Verhalten ist nicht exakt dasselbe.
Wer einen “Swipe to Refresh” anstatt einen Pull to Refresh in seiner App einbauen möchte, sollte auf das SwipeRefreshLayout zurückgreifen, welches eine einfache Implementation ermöglicht. Wer allerdings nicht das Verhalten von Google Now sondern lieber das Verhalten von Google+ Plus haben möchte, muss ein wenig in die Trickkiste greifen – wir zeigen euch wie!
Verhalten der Google Apps
Das Verhalten beider Apps unterscheidet sich darin, dass in Google Now ein “Overscroll” des Parent Views stattfindet. Somit ähnelt das Verhalten eher dem von iOS bekannten Pull to Refresh. In der Google+ App, wie auch in der GMail App findet kein “Overscroll” statt.
Am besten schaut ihr euch beide Google Apps auf eurem Smartphone an, ihr werdet den Unterschied sehen.
It’s open Source
Da der Code von Google open source ist, findet man den Code vom SwipeRefreshLayout auf GitHub [android-support-v4].
Um nun das Verhalten von der Google+ bzw. der GMail App zu erhalten, reicht es nicht eine Custom View zu erstellen in der Ihr von dem SwipeRefreshLayout ableitet, sondern es muss eine eigene Implementation erfolgen.
Eigene Implementierung
Auf der oben genannten GitHub Seite benötigt Ihr folgende Klassen, die Ihr euch herunterladen/kopieren könnt und in euer eigenes Projekt integriert.
- SwipeRefreshLayout
- SwipeProgressBar
- BakedBezierInterpolator
Einmal in euer Projekt eingefügt, ändern Ihr am besten den Namen der Klasse SwipeRefreshLayout in etwas wie “MySwipeRefreshLayout” oder “NotScrollableSwipeRefreshLayout” um Verwirrungen mit der eigentlichen Android Support V4 Library Implementierung zu vermeiden.
Kommen wir nun zu den Code Änderungen, welche ausschließlich in der Klasse “SwipeRefreshLayout” bzw. “MySwipeRefreshLayout” erfolgen.
1) Sucht die Methode: private void updateContentOffsetTop(int targetTop) {
2) Ändert die Zeile setTargetOffsetTopAndBottom(targetTop - currentTop);
in setTargetOffsetTopAndBottom(0);
Hier nochmal die neue Methode:
private void updateContentOffsetTop(int targetTop) { final int currentTop = mTarget.getTop(); if (targetTop > mDistanceToTriggerSync) { targetTop = (int) mDistanceToTriggerSync; } else if (targetTop < 0) { targetTop = 0; } //setTargetOffsetTopAndBottom(targetTop - currentTop); setTargetOffsetTopAndBottom(0); // MOD: Prevent Scroll Down Animation }
Somit ist der Offset immer 0 und das Scrollverhalten der Child View innerhalb des SwipeRefreshLayouts ist deaktiviert.
Hier noch ein Link zu einem StackOverflow Eintrag welcher ggfs. weiterhelfen könnte, da er auch auf diesen Blog hier verlinkt: StackOverflow: SwipeRefreshLayout - swipe down to refresh but not move the view pull down
Wer noch etwas allgemeines über die Verwendung des SwipeRefreshLayouts erfahren möchte kann auch mal hier vorbeischauen: antonioleiva.com/swiperefreshlayout/