J'ai une disposition très simple , mais quand je l' appelle setRefreshing(true)
dans onActivityCreated()
mon fragment, il ne montre pas au départ.
Cela ne s'affiche que lorsque je fais une traction pour actualiser. Des idées pourquoi cela n'apparaît pas au départ?
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>
Code de fragment:
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
tonitruant Ninja
la source
la source
Réponses:
Face au même problème. Ma solution -
la source
Voir plutôt la réponse de Volodymyr Baydalka.
Ce sont les anciennes solutions de contournement.
Cela sert à travailler sur la version antérieure du
android.support.v4
, mais de la version 21.0.0 en cours , il ne fonctionne pas et existe encore avecandroid.support.v4:21.0.3
sortie au 10-12 Décembre, 2014 et c'est la raison.L'indicateur SwipeRefreshLayout n'apparaît pas lorsque le
setRefreshing(true)
est appelé avant leSwipeRefreshLayout.onMeasure()
Solution de contournement:
appel
setProgressViewOffset()
sur leSwipeRefreshLayout
qui invalide la vue circulaire de la mise en page provoquantSwipeRefreshLayout.onMeasure()
un appel immédiat.MISE À JOUR Meilleure solution de contournement
Parce que la barre d'action peut devenir plus mince lorsque l'orientation change ou que vous avez défini la taille de la barre d'action manuellement. Nous définissons le décalage en pixels à partir du haut de cette vue à laquelle la flèche de progression doit se réinitialiser après un geste de balayage réussi à la taille actuelle de la barre d'action.
MISE À JOUR 20 novembre 2014
S'il n'est pas très important pour votre application d'afficher le SwipeRefreshLayout une fois la vue démarrée. Vous pouvez simplement le publier à un moment dans le futur en utilisant des gestionnaires ou tout ce que vous voulez.
par exemple.
ou comme la réponse de Volodymyr Baydalka l'a mentionnée.
Voici le problème dans le suivi des problèmes Android. Veuillez voter pour leur montrer que nous avons besoin de le corriger.
la source
delay time
? J'utilise500
sur monGalaxy S4
. Je ne sais pas si cela poserait un problème sur un autre appareil.500
que ça irait bien.Je l'ai testé sur leemulator
.Je voulais juste êtresafe
avec les1000
millisecondesMa solution est de remplacer
SwipeRefreshLayout
:la source
la source
setRefreshing(false)
enveloppéonGlobalLayoutListener()
ne supprime pas l'indicateur de chargement.Avec la bibliothèque de support Android 24.2.0, le problème aurait dû être résolu! https://developer.android.com/topic/libraries/support-library/revisions.html#24-2-0-bugfixes
la source
Basé sur la réponse de Volodymyr Baydalka , ce n'est qu'une petite idée qui vous aidera à garder le code propre. Cela mérite un post, je crois: vous pourrez facilement inverser le comportement de la publication à l'appel direct de méthode, une fois le bogue corrigé.
Écrivez une classe utilitaire comme:
Dans votre code, remplacez
mSwipeContainer.setRefreshing(isRefreshing)
parUtils.setRefreshing(mSwipeContainer, isRefreshing)
: maintenant, un seul point du code doit être modifié une fois le bogue corrigé, laUtils
classe. La méthode peut également être insérée ensuite (et supprimée deUtils
).Il n'y aura généralement aucune différence visuelle notable. Gardez toutefois à l'esprit que l'actualisation en attente pourrait maintenir vos anciennes
Activity
instances en vie, en conservantSwipeRefreshLayout
leurs hiérarchies de vues. Si c'est un problème, modifiez la méthode pour utiliserWeakReference
s, mais normalement vous ne bloquez pas le thread de l'interface utilisateur de toute façon, et ne retardez donc gc que de quelques millisecondes.la source
Vous pouvez également appeler cette méthode avant setRefreshing ..
Cela fonctionne pour moi.
la source
J'ai utilisé la bibliothèque AppCompat
com.android.support:appcompat-v7:21.0.3
, en utilisant votre même approche et cela a fonctionné. Donc, vous mettez à jour la version de cette bibliothèque.Conseil:
RelativeLayout
ne prend pas en charge l'orientation, c'est un attribut pourLinearLayout
.Mise en page XML:
la source
En plus de Volodymyr Baydalka, utilisez également le code suivant:
Explication J'ai implémenté la solution donnée par Volodymyr Baydalka (en utilisant des fragments) mais après le démarrage de swipeReferesh, il n'est jamais parti même en appelant
swipeContainer.setRefreshing(false);
donc j'ai dû implémenter le code donné ci-dessus qui a résolu mon problème. toutes les autres idées pourquoi cela se produit sont les bienvenues.Cordialement,
"com.android.support:appcompat-v7:22.2.1"
la source
@ niks.stack En réponse à sa réponse, je montrerais la roue de progression après
onLayout()
avoir été fait. Quand je l'ai utilisé directement aprèsonMeasure()
, il n'honorerait pas certains des décalages, mais l'utiliser après l'aonLayout()
fait.la source
Ma solution (sans support v7) -
la source
J'utilise 'com.android.support:appcompat-v7:23.1.1'
auparavant j'utilisais à l'
swipeRefreshLayout.setRefreshing(true);
intérieurgetData()
méthode , donc cela ne fonctionnait pas. Je ne sais pas pourquoi sa méthode ne fonctionne pas.Bien que je n'ai utilisé
swipeRefreshLayout.setRefreshing(true);
qu'une seule fois dans mon Fragment.la source
Essaye ça
mSwipeRefreshLayout.setNestedScrollingEnabled (true);
la source
Une autre solution de contournement consiste à créer un nouveau contrôle et à dériver de SwipeRefreshLayout. Remplacez la fonction OnMeasure et activez à nouveau l'actualisation, si l'actualisation est activée. J'utilise cette solution dans un projet xamarin et cela fonctionne bien. Voici quelques exemples de code C #:
la source