Ich habe SwipeRefreshLayout
und ViewPager
in meiner App implementiert, aber es gibt ein großes Problem: Wenn ich nach links / rechts wische, um zwischen den Seiten zu wechseln, ist das Scrollen zu empfindlich. Ein kleines Wischen nach unten löst auch die SwipeRefreshLayout
Aktualisierung aus.
Ich möchte ein Limit festlegen, wann das horizontale Wischen beginnt, und dann das horizontale Wischen nur erzwingen, bis das Wischen beendet ist. Mit anderen Worten, ich möchte das vertikale Wischen abbrechen, wenn sich der Finger horizontal bewegt.
Dieses Problem tritt nur auf ViewPager
, wenn ich nach unten wische und die SwipeRefreshLayout
Aktualisierungsfunktion ausgelöst wird (der Balken wird angezeigt) und dann meinen Finger horizontal bewege. Es sind immer noch nur vertikale Wischbewegungen zulässig.
Ich habe versucht, die ViewPager
Klasse zu erweitern , aber es funktioniert überhaupt nicht:
public class CustomViewPager extends ViewPager {
public CustomViewPager(Context ctx, AttributeSet attrs) {
super(ctx, attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
boolean in = super.onInterceptTouchEvent(ev);
if (in) {
getParent().requestDisallowInterceptTouchEvent(true);
this.requestDisallowInterceptTouchEvent(true);
}
return false;
}
}
Layout xml:
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/viewTopic"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.myapp.listloader.foundation.CustomViewPager
android:id="@+id/topicViewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</android.support.v4.widget.SwipeRefreshLayout>
Jede Hilfe wäre dankbar, danke
quelle
SwipeRefreshLayout
?Antworten:
Ich bin nicht sicher, ob Sie dieses Problem noch haben, aber Google I / O App iosched löst dieses Problem folgendermaßen:
Ich habe das gleiche benutzt und funktioniert ganz gut.
BEARBEITEN: Verwenden Sie addOnPageChangeListener () anstelle von setOnPageChangeListener ().
quelle
Sehr einfach gelöst, ohne etwas zu erweitern
arbeite wie ein Zauber
quelle
View
, die Sie möglicherweise im Inneren habenViewPager
, daSwipeRefreshLayout
sogar vertikales Bildlauf nur für das untergeordnete Element der obersten Ebene möglich ist (und in APIs, die niedriger als ICS sind, nur, wenn es sich zufällig um a handeltListView
). .ViewPager
drinnenSwipeRefrestLayout
und der ViewPager hatListview
!SwipeRefreshLayout
Lassen Sie mich nach unten scrollen, aber beim Scrollen nach oben wird der Aktualisierungsfortschritt ausgelöst. Irgendein Vorschlag?Ich habe dein Problem getroffen. Passen Sie das SwipeRefreshLayout an, um das Problem zu lösen.
Siehe den Link ref:
quelle
Ich habe dies auf eine frühere Antwort gestützt, fand aber, dass dies etwas besser funktioniert. Die Bewegung beginnt mit einem ACTION_MOVE-Ereignis und endet meiner Erfahrung nach entweder mit ACTION_UP oder ACTION_CANCEL.
quelle
Aus irgendeinem Grund , um sie am besten bekannt nur, die Support - Bibliothek Entwickler - Team sah fit zu gewaltsam abfangen alle vertikalen Schleppbewegung Ereignisse von
SwipeRefreshLayout
‚s Kind Layout, auch wenn ein Kind das Eigentum an der Veranstaltung ausdrücklich anfordert. Das einzige, worauf sie prüfen, ist, dass der vertikale Bildlaufstatus des Hauptkindes Null ist (für den Fall, dass das Kind vertikal scrollbar ist). DasrequestDisallowInterceptTouchEvent()
Methode wurde mit einem leeren Körper und dem (nicht so) leuchtenden Kommentar "Nope" überschrieben.Der einfachste Weg, um dieses Problem zu lösen, besteht darin, die Klasse aus der Support-Bibliothek in Ihr Projekt zu kopieren und die Methodenüberschreibung zu entfernen.
ViewGroup
Die Implementierung verwendet den internen Status für die BehandlungonInterceptTouchEvent()
, sodass Sie die Methode nicht einfach erneut überschreiben und duplizieren können. Wenn Sie die Implementierung der Support-Bibliothek wirklich überschreiben möchten , müssen Sie bei Aufrufen ein benutzerdefiniertes Flag einrichtenrequestDisallowInterceptTouchEvent()
und das darauf basierende Verhalten überschreibenonInterceptTouchEvent()
undonTouchEvent()
(oder möglicherweise hackencanChildScrollUp()
).quelle
Ich habe eine Lösung für ViewPager2 gefunden. Ich benutze Reflexion, um die Widerstandsempfindlichkeit wie folgt zu reduzieren:
Es funktioniert wie ein Zauber für mich.
quelle
Es gibt ein Problem mit der Lösung von nhasan:
Wenn der horizontale Wisch, der den
setEnabled(false)
Anruf auf demSwipeRefreshLayout
in auslöst, auftritt,OnPageChangeListener
wenn derSwipeRefreshLayout
bereits einen Pull-to-Reload erkannt hat, aber den Benachrichtigungsrückruf noch nicht aufgerufen hat, verschwindet die Animation, aber der interne Status derSwipeRefreshLayout
bleibt für immer auf "Aktualisieren" als Nein Es werden Benachrichtigungsrückrufe aufgerufen, die den Status zurücksetzen könnten. Aus Anwendersicht bedeutet dies, dass Pull-to-Reload nicht mehr funktioniert, da nicht alle Pull-Gesten erkannt werden.Das Problem hierbei ist, dass der
disable(false)
Aufruf die Animation des Spinners entfernt und der Benachrichtigungsrückruf von deronAnimationEnd
Methode eines internen AnimationListener für diesen Spinner aufgerufen wird, der auf diese Weise nicht in der richtigen Reihenfolge eingestellt ist.Zwar brauchte unser Tester mit den schnellsten Fingern, um diese Situation zu provozieren, aber es kann auch in realistischen Szenarien gelegentlich vorkommen.
Eine Lösung, um dies zu beheben, besteht darin, die
onInterceptTouchEvent
MethodeSwipeRefreshLayout
wie folgt zu überschreiben :Verwenden Sie die
MySwipeRefreshLayout
in Ihrem Layout - Datei und ändern Sie den Code in der Lösung von mhasan inquelle
Es kann ein Problem mit der Antwort von @huu duy auftreten, wenn der ViewPager in einem vertikal scrollbaren Container platziert wird, der wiederum im SwiprRefreshLayout platziert wird. Wenn der inhaltsrollbare Container nicht vollständig nach oben gescrollt ist, ist dies möglicherweise nicht möglich Aktivieren Sie das Wischen zum Aktualisieren in derselben Bildlaufgeste. In der Tat lehnt das vorgeschlagene CustomSwipeToRefresh diese Geste ab, wenn Sie mit dem Scrollen des inneren Containers beginnen und den Finger mehr als mTouchSlop unbeabsichtigt horizontal bewegen (dies ist standardmäßig 8 dp). Ein Benutzer muss also erneut versuchen, mit der Aktualisierung zu beginnen. Dies kann für den Benutzer seltsam aussehen. Ich habe den Quellcode des ursprünglichen SwipeRefreshLayout aus der Support-Bibliothek in mein Projekt extrahiert und das onInterceptTouchEvent () neu geschrieben.
Siehe mein Beispielprojekt auf Github .
quelle