SwipeToRefresh im ViewPager

  • Antworten:11
  • GeschlossenBentwortet
Sven R.
  • Forum-Beiträge: 1.904

24.09.2014, 21:17:26 via App

Moin!

Ich habe bis jetzt immer den PullToRefresh von chrisbane benutzt. Jetzt möchte ich aber auf den offiziellen umsteigen aus der Support Library v4.
Wenn das Refresh View das oberste über dem ViewPager ist und ihn ummantelt, gibt es Darstellungsfehler, die nicht zu akzeptieren sind.
Wenn ich das Refresh View einzeln in jedes Fragment des ViewPagers tue, habe ich beim Start der App kein Refresh View, das das Laden anzeigt, weil es erst mit dem Fragment nach dem Laden erzeugt wird.
Also, hat jemand Vorschläge, wie es doch mit dem aus der Support Library gehen könnte? Oder hat jemand eine Alternative, außer die von Chris, weil sie deprecated ist?

Sven

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

24.09.2014, 21:25:25 via App

Hallo Sven,
Wenn ich dich richtig verstanden habe,
meinst du das hier: http://antonioleiva.com/swiperefreshlayout/

Bisher hast du ein SwipeRefreshLayout in jedem Fragment?

Das ist ja eigentlich etwas umständlich.
Ist es nicht besser in die "FragmentManager" Activity das Refresh Layout zu integrieren, sodass es auf allen Fragments immer angezeigt wird?
Dabei kommt es aber auf dem Aufbau des MainAcitiviy codes und der main Xml an.
Wie sieht das ganze denn aus?

LG Pascal

— geändert am 24.09.2014, 21:25:37

LG Pascal //It's not a bug, it's a feature. :) ;)

Sven R.
  • Forum-Beiträge: 1.904

24.09.2014, 21:40:37 via App

Ich möchte das Refresh View, das auf der von dir verlinkten Seite erwähnt wird, benutzen. Wenn dies auf oberster Ebene ist und nur den ViewPager in sich hat, kommt es zu den Problemen bei der Darstellung.
Bis jetzt habe ich ja einen anderes Refresh View(Chris). Da gibt es keine Probleme bei der Darstellung. Ich habe aber das View in jedes Fragment getan, weil es sonst nicht reagierte oder so (keine Ahnung, lange her). Zusätzlich musste ich aber auch das View über den ViewPager tun, damit das Laden angezeigt werden kann, bevor überhaupt ein Fragment erzeugt wurde.

Aber die alte Implementierung tut jetzt nicht nur Sache. Ich möchte nur das offizielle View richtig mit einem ViewPager als einziges Child implementieren. Code kann ich grade nicht zeigen. Aber theoretisch ist der ViewPager vom View ummantelt und mehr nichts!? Abgesehen von dem Listener und den Farben, die festgelegt werden.

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

24.09.2014, 21:59:22 via App

Das wird so nicht funktionieren. Wenn du dir meinen Link von oben durchgelesen hast, dann wüsstest du dass eine RefreshView nur mir ListViews allgemein mit Swipable Content funktioniert. Anders kannst du es nicht machen.
Zudem verstehe ich gerade nicht wieso dich das stört, dass es in jedem fragment neu angezeigt wird.

LG Pascal //It's not a bug, it's a feature. :) ;)

Sven R.
  • Forum-Beiträge: 1.904

25.09.2014, 07:55:38 via App

Okay, danke.

Mein Problem ist nur, dass die ListView (im Fragment) mit dem SwipeToRefresh erst nach dem Laden der Daten erzeugt wird. Also kann ich nicht das Laden anzeigen, bevor das Fragment samt ListView erstellt worden ist. Und das geschieht erst nach dem Laden. Darum ist kein SwipeToRefresh zum Laden anzeigen da.
Es lädt natürlich auch ohne das View, aber der Nutzer weiß es nicht, weil es nicht optisch dargestellt wird.
Nach Überlegungen wäre das meine Lösung: Dem Adapter des ViewPagers schon vor dem Laden anleiten, ein leeres Fragment nur mit SwipeToRefresh und ListView drin zu erstellen. Dieses SwipeToRefresh wird dann zum Laden anzeigen genutzt.
Und nach dem Laden wird der ViewPager mit den Daten gefüttert.

— geändert am 25.09.2014, 07:56:11

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

25.09.2014, 11:46:33 via Website

Das wird so nicht funktionieren, denke ich.
Zeig mal den Code deines Fragments (der für das laden etc. wichtig ist), warscheinlich wird nur das Animationsevent zuspät gestartet oder so.

LG Pascal

LG Pascal //It's not a bug, it's a feature. :) ;)

Sven R.
  • Forum-Beiträge: 1.904

25.09.2014, 13:51:20 via App

Das Fragment lädt nicht selbst die Daten, die Daten bekommt es bei der Initialisierung des Fragments. Code zeige ich nachher.
Edit: wahrscheinlich Ändere ich das, dass das Fragment selber die Daten lädt.

— geändert am 25.09.2014, 13:53:43

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

25.09.2014, 13:56:17 via App

Genau darauf wolkte ich hinaus. Dann wird es auch funktionieren.
Zudem ist dann der Ladevorgang auch in jedem Fragment drinne und die Programmkomponenten sind besser strukturiert.

LG Pascal //It's not a bug, it's a feature. :) ;)

Sven R.
  • Forum-Beiträge: 1.904

25.09.2014, 16:08:17 via App

Ein kleines Problem gäbe es immer noch(du weißt, worum es geht): Die Fragmente im ViewPager haben dieselbe Informationsquelle(Vertretungsplan). Jedes Fragment steht für einen Tag. Es gibt normalerweise immer zwei Tabs, außer in den Ferien manchmal nur einen. Es wäre unsinnig, den Vertretungsplan zwei mal einzeln in jedem Fragment zu laden. Außerdem weiß das Fragment nicht welchen Tag es anzeigen soll. Da müsste ich dann umständlich über die Position des Tabs gehen.

Aber mir fällt gerade so langsam auf, dass die Idee an sich unsinnig ist. Man braucht in so einer App einfach kein SwipeToRefresh. Der Vertretungsplan ändert sich ja nicht so schnell. Außerdem wird er bei jedem onResume neu geladen.

Meine Idee: SwipeToRefresh über den ViewPager tun, obwohl das nicht richtig ist, und nur zum Anzeigen des Ladens benutzen. Also deaktiviere ich die Swipe Funktion mit setEnabled(false). Das setzt natürlich vorraus, dass es keine Probleme bei der Darstellung gibt.

Edit: Das Laden über das Fragment erscheint mir nicht sinnvoll. Ich werde es wohl beim zentralen Laden lassen.

— geändert am 25.09.2014, 16:09:34

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

25.09.2014, 16:22:45 via Website

Ich denke das mit dem SwipeToRefresh ist nur spielerei von dir :P
Wie du bereits erkannt hast, reicht im Eck oben ein Refreshbutton
(glaube den hattest du schonmal)
Sonst reicht dein Aktualisierungsinterval.
Wenn du wiklich richtig SwitpeToRefresh einbauen willst, musst du den Plan wiklich in jedes Fragment einzeln Laden und nann über die Position den Tag erausfinden.
Sonst sehe ich keine möglichkeit bis auf:
ViewPager herausnehmen und Für den kompletten Plan eine ListView.
Aber das ist nicht wirklich das was du willst, nehme ich an.
->Fazit: Ich würde kein SwipeToRefresh einbauen, da es
1. aufwändig
2. nicht Effizient (da jedes Fragment den kompletten plan laden müsste)
3. nicht nötig
ist.
Bisher hat dir doch auch ein Refresh Button etc. gereicht oder?
Natürlich kannst du dir die Mühe machen und dich damit rumärgern wie man das SwipeToRefresh in vor/als Parent des ViewPagers bekommt.
Ich denke das ist kaum möglich, ausser es gibt so eine Lib ähnlich wie die von Chris dafür.
Das wäre für mich eine nichtlösbare Aufgabe, bei der es mir einfach darum geht, dass ich meine Zeit totschlage :-)

LG Pascal

LG Pascal //It's not a bug, it's a feature. :) ;)

Sven R.
  • Forum-Beiträge: 1.904

25.09.2014, 16:53:12 via Website

Die Funktion zum Swipen werde ich ganz raus nehmen. Wenn es aber klappt, dass nur das Laden ohne Probleme angezeigt wird, dann lasse ich das View nur deswegen drin. Wenn es Probleme gibt, mache ich mir keinen Kopf, aber ein schönes Wochenende. ;)
Und einen Refresh-Button möchte ich nicht einbauen, weil das Resfreshen einfach in so einer Situation unnötig ist.
Danke für deine Ratschläge, hier kann zu gemacht werden. :)

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

25.09.2014, 16:56:11 via App

Dann werde ich deinen Wunsch mal erfüllen ^^

LG Pascal //It's not a bug, it's a feature. :) ;)