Ich habe ein sehr einfaches Layout , aber wenn ich rufe setRefreshing(true)
in onActivityCreated()
meinem Fragmente, es zeigt nicht , zunächst.
Es wird nur angezeigt, wenn ich zum Aktualisieren ziehe. Irgendwelche Ideen, warum es anfangs nicht auftaucht?
Fragment xml:
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swipe_container"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
</RelativeLayout>
</ScrollView>
</android.support.v4.widget.SwipeRefreshLayout>
Fragmentcode:
public static class LinkDetailsFragment extends BaseFragment implements SwipeRefreshLayout.OnRefreshListener {
@InjectView(R.id.swipe_container)
SwipeRefreshLayout mSwipeContainer;
public static LinkDetailsFragment newInstance(String subreddit, String linkId) {
Bundle args = new Bundle();
args.putString(EXTRA_SUBREDDIT, subreddit);
args.putString(EXTRA_LINK_ID, linkId);
LinkDetailsFragment fragment = new LinkDetailsFragment();
fragment.setArguments(args);
return fragment;
}
public LinkDetailsFragment() {
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mSwipeContainer.setOnRefreshListener(this);
mSwipeContainer.setColorScheme(android.R.color.holo_blue_bright,
android.R.color.holo_green_light,
android.R.color.holo_orange_light,
android.R.color.holo_red_light);
mSwipeContainer.setRefreshing(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final View rootView = inflater.inflate(R.layout.fragment_link_details, container, false);
ButterKnife.inject(this, rootView);
return rootView;
}
@Override
public void onRefresh() {
// refresh
}
}
android
swiperefreshlayout
donnernde Ninja
quelle
quelle
Antworten:
Konfrontiert mit dem gleichen Problem. Meine Lösung -
quelle
Siehe stattdessen die Antwort von Volodymyr Baydalka.
Dies sind die alten Problemumgehungen.
Das funktionierte früher bei früheren Versionen von
android.support.v4
, aber ab Version 21.0.0 funktioniert es nicht mehr und existiert immer noch mit derandroid.support.v4:21.0.3
Veröffentlichung vom 10. bis 12. Dezember 2014, und dies ist der Grund.Der SwipeRefreshLayout-Indikator wird nicht angezeigt, wenn der
setRefreshing(true)
vor dem aufgerufen wirdSwipeRefreshLayout.onMeasure()
Problemumgehung:
Aufrufen
setProgressViewOffset()
desSwipeRefreshLayout
, der die Kreisansicht des Layouts ungültig macht undSwipeRefreshLayout.onMeasure()
sofort aufgerufen wird.UPDATE Bessere Problemumgehung
Weil die Aktionsleiste dünner werden könnte, wenn sich die Ausrichtung ändert oder Sie die Größe der Aktionsleiste manuell festgelegt haben. Wir legen den Versatz in Pixel von oben in dieser Ansicht fest, bei dem der Fortschrittsspinner nach einer erfolgreichen Wischgeste auf die aktuelle Größe der Aktionsleiste zurückgesetzt werden soll.
UPDATE 20. November 2014
Wenn es für Ihre App nicht sehr wichtig ist, das SwipeRefreshLayout nach dem Start der Ansicht anzuzeigen. Sie können es einfach zu einem späteren Zeitpunkt veröffentlichen, indem Sie Handler oder andere Elemente verwenden.
als Beispiel.
oder wie Volodymyr Baydalkas Antwort erwähnt.
Hier ist das Problem im Android Issue Tracker. Bitte stimmen Sie es ab, um ihnen zu zeigen, dass wir es reparieren müssen.
quelle
delay time
? Ich benutze500
auf meinemGalaxy S4
. Ich bin mir nicht sicher, ob dies auf einem anderen Gerät ein Problem darstellen würde.500
getestet , aber ich denke, es würde gut gehen. Ich habe es auf der getestet.emulator
Ich wollte nursafe
mit den1000
Millisekunden seinMeine Lösung besteht darin, Folgendes zu überschreiben
SwipeRefreshLayout
:quelle
quelle
setRefreshing(false)
Einschließen vononGlobalLayoutListener()
Wraps nicht verworfen.Mit der Android Support Library 24.2.0 sollte das Problem behoben sein! https://developer.android.com/topic/libraries/support-library/revisions.html#24-2-0-bugfixes
quelle
Basierend auf der Antwort von Volodymyr Baydalka ist dies nur eine kleine Idee, die Ihnen hilft, den Code sauber zu halten. Ich glaube, es verdient einen Beitrag: Sie können das Verhalten leicht vom Posten zum direkten Methodenaufruf zurücksetzen, sobald der Fehler behoben ist.
Schreiben Sie eine Utility-Klasse wie:
In Ihrem Code ersetzen Sie
mSwipeContainer.setRefreshing(isRefreshing)
durchUtils.setRefreshing(mSwipeContainer, isRefreshing)
: Jetzt muss nur noch ein Punkt im Code geändert werden, sobald der Fehler behoben ist, dieUtils
Klasse. Die Methode kann dann auch inline (und ausUtils
) entfernt werden.In der Regel ist kein visueller Unterschied erkennbar. Beachten Sie jedoch, dass die ausstehende Aktualisierung Ihre alten
Activity
Instanzen am Leben erhalten kann , indem Sie dieSwipeRefreshLayout
in ihren Ansichten enthaltenen Hierarchien beibehalten. Wenn dies ein Problem darstellt, optimieren Sie die Methode, umWeakReference
s zu verwenden. Normalerweise blockieren Sie den UI-Thread jedoch nicht und verzögern gc daher nur um einige Millisekunden.quelle
Sie können diese Methode auch vor setRefreshing aufrufen.
Es funktioniert für mich.
quelle
Ich habe AppCompat Library
com.android.support:appcompat-v7:21.0.3
mit demselben Ansatz verwendet und es hat funktioniert. Sie aktualisieren also die Version dieser Bibliothek.Hinweis:
RelativeLayout
Unterstützt keine Orientierung, es ist ein Attribut fürLinearLayout
.Layout XML:
quelle
Verwenden Sie neben Volodymyr Baydalka auch den folgenden Code:
Erläuterung Ich habe die von Volodymyr Baydalka angegebene Lösung (unter Verwendung von Fragmenten) implementiert, aber nachdem swipeReferesh gestartet wurde, ging sie auch beim Aufruf
swipeContainer.setRefreshing(false);
nicht verloren und musste den oben angegebenen Code implementieren, der mein Problem löste. Weitere Ideen, warum dies geschieht, sind sehr willkommen.Grüße,
'com.android.support:appcompat-v7:22.2.1'
quelle
@ niks.stack Als Antwort auf seine Antwort würde ich das Fortschrittsrad zeigen, nachdem
onLayout()
es fertig ist. Wenn ich es direkt danach verwendeteonMeasure()
, wurden einige der Offsets nicht berücksichtigt, aber wenn ich es danach verwendete , wurde es verwendetonLayout()
.quelle
Meine Lösung (ohne Unterstützung v7) -
quelle
Ich benutze 'com.android.support:appcompat-v7:23.1.1'
Früher habe ich die
swipeRefreshLayout.setRefreshing(true);
Inside-getData()
Methode verwendet, also hat es nicht funktioniert. Ich weiß nicht, warum es nicht innerhalb der Methode funktioniert.Obwohl ich
swipeRefreshLayout.setRefreshing(true);
nur einmal in meinem Fragment verwendet habe.quelle
Versuche dies
mSwipeRefreshLayout.setNestedScrollingEnabled (true);
quelle
Eine weitere Problemumgehung besteht darin, ein neues Steuerelement zu erstellen und von SwipeRefreshLayout abzuleiten. Überschreiben Sie die OnMeasure-Funktion und schalten Sie die Aktualisierung erneut um, wenn die Aktualisierung aktiviert ist. Ich verwende diese Lösung in einem Xamarin-Projekt und sie funktioniert gut. Hier ein Beispiel für einen C # -Code:
quelle