Mam bardzo prosty układ, ale gdy zgłoszę setRefreshing(true)
w onActivityCreated()
mojej fragmentu, nie wykazuje początkowo.
Pokazuje się tylko wtedy, gdy pociągam, by odświeżyć. Jakieś pomysły, dlaczego nie pojawia się na początku?
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>
Kod fragmentu:
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
thunderousNinja
źródło
źródło
Odpowiedzi:
W obliczu tego samego problemu. Moje rozwiązanie -
źródło
Zamiast tego zobacz odpowiedź Volodymyra Baydalki.
To są stare obejścia.
To działało wcześniej we wcześniejszej wersji
android.support.v4
, ale od wersji 21.0.0 w toku nie działa i nadal istnieje zandroid.support.v4:21.0.3
wydaniem 10-12 grudnia 2014 i to jest powód.Wskaźnik SwipeRefreshLayout nie pojawia się, gdy
setRefreshing(true)
jest wywoływana przedSwipeRefreshLayout.onMeasure()
Obejście:
dzwoniąc
setProgressViewOffset()
naSwipeRefreshLayout
które invalidtes pogląd grono układ powodującSwipeRefreshLayout.onMeasure()
na miano natychmiast.AKTUALIZUJ Lepsze obejście
Ponieważ pasek akcji może stać się cieńszy w przypadku zmiany orientacji lub ręcznego ustawienia rozmiaru paska akcji. Ustawiliśmy przesunięcie w pikselach od góry tego widoku, przy którym pokrętło postępu powinno zresetować się po udanym geście przesunięcia do bieżącego rozmiaru paska akcji.
UPDATE 20 listopada 2014
Jeśli nie jest to bardzo ważne dla Twojej aplikacji, aby wyświetlić SwipeRefreshLayout po uruchomieniu widoku. Możesz po prostu opublikować to w przyszłości, używając programów obsługi lub dowolnej innej rzeczy.
jako przykład.
lub jak wspomniano w odpowiedzi Wołodymyra Baydalki.
Oto problem w narzędziu do śledzenia problemów w systemie Android. Zagłosuj na to, aby pokazać im, że musimy to naprawić.
źródło
delay time
? Używam500
na moimGalaxy S4
. Nie jestem pewien, czy byłby to problem na innym urządzeniu.500
byłoby dobrze. Przetestowałem to na. Poemulator
prostu chciałem byćsafe
z1000
milisekundamiMoim rozwiązaniem jest zastąpienie
SwipeRefreshLayout
:źródło
źródło
setRefreshing(false)
zawinięte wywołanieonGlobalLayoutListener()
nie wyłącza wskaźnika obciążenia.Dzięki bibliotece obsługi Androida 24.2.0 problem powinien zostać rozwiązany! https://developer.android.com/topic/libraries/support-library/revisions.html#24-2-0-bugfixes
źródło
Na podstawie odpowiedzi Wołodymyra Baydalki , jest to tylko mały pomysł, który pomoże Ci zachować czystość kodu. Wierzę, że zasługuje na post: będziesz w stanie łatwo zmienić zachowanie z wysyłania do bezpośredniego wywołania metody, gdy błąd zostanie naprawiony.
Napisz klasę użytkową taką jak:
W swoim kodzie zamień
mSwipeContainer.setRefreshing(isRefreshing)
naUtils.setRefreshing(mSwipeContainer, isRefreshing)
: teraz tylko jeden punkt w kodzie musi zostać zmieniony po naprawieniu błędu,Utils
klasa. Metodę można również wstawić (i usunąć zUtils
).Zwykle nie będzie zauważalnej różnicy wizualnej. Należy jednak pamiętać, że oczekujące odświeżenie może utrzymać stare
Activity
instancje przy życiu , utrzymującSwipeRefreshLayout
w ich hierarchiach widoku. Jeśli jest to problem, dostosuj metodę, aby użyćWeakReference
s, ale normalnie i tak nie blokujesz wątku interfejsu użytkownika, a tym samym opóźniasz gc tylko o kilka milisekund.źródło
Możesz również wywołać tę metodę przed setRefreshing.
To działa dla mnie.
źródło
Użyłem biblioteki AppCompat
com.android.support:appcompat-v7:21.0.3
, używając tego samego podejścia i zadziałało. Tak więc aktualizujesz wersję tej biblioteki.Rada:
RelativeLayout
nie obsługuje orientacji, jest atrybutem dlaLinearLayout
.Układ XML:
źródło
Oprócz Volodymyra Baydalki użyj również następującego kodu:
Wyjaśnienie Zaimplementowałem rozwiązanie podane przez Volodymyra Baydalkę (używając fragmentów), ale po uruchomieniu swipeReferesha nigdy nie zniknęło, nawet po wywołaniu,
swipeContainer.setRefreshing(false);
więc musiałem zaimplementować powyższy kod, który rozwiązał mój problem. wszelkie pomysły, dlaczego tak się dzieje, są mile widziane.Pozdrowienia,
„com.android.support:appcompat-v7:22.2.1”
źródło
@ niks.stack W odpowiedzi na jego odpowiedź, pokażę koło postępu po zakończeniu
onLayout()
. Kiedy użyłem go bezpośrednio poonMeasure()
, nie uszanowałoby to niektórych przesunięć, ale użycie go późniejonLayout()
.źródło
Moje rozwiązanie (bez wsparcia v7) -
źródło
Używam „com.android.support:appcompat-v7:23.1.1”
poprzednio
swipeRefreshLayout.setRefreshing(true);
używałemgetData()
metody inside , więc nie działała. Nie wiem, dlaczego nie działa w metodzie.Chociaż użyłem
swipeRefreshLayout.setRefreshing(true);
tylko raz w moim fragmencie.źródło
Spróbuj tego
mSwipeRefreshLayout.setNestedScrollingEnabled (true);
źródło
Innym obejściem jest utworzenie nowej kontrolki i pochodnej z SwipeRefreshLayout. Zastąp funkcję OnMeasure i ponownie przełącz odświeżanie, jeśli odświeżanie jest aktywowane. Używam tego rozwiązania w projekcie Xamarin i działa dobrze. Oto przykładowy kod C #:
źródło