SwipeRefreshLayout – faites glisser vers le bas pour actualiser, mais ne pas déplacer la vue vers le bas

C'est possible ?? Comme le dit un titre

Faites glisser vers le bas pour rafraîchir la mise en page, mais collez la mise en page, ne la déplacez pas le long de la gueule de glissement

  • L'icône AppCompat ShareActionProvider est trop grande par rapport à d'autres icônes
  • Configuration de périphérique Android pour AOSP
  • Comment masquer la barre d'état dans Android
  • Comment intégrer Scala dans la plate-forme Android centrale?
  • Modifier un AndroidManifest lors de la compilation pour supprimer la clé API
  • Programmation sur (pas * pour *) un appareil Android
  • Merci – J'utilise SwipeRefreshLayout

  • Ajout d'une bibliothèque externe dans un studio Android
  • Android comment obtenir la date de demain
  • Activation du flash de l'appareil photo lors de l'enregistrement vidéo
  • Vue d'ensemble du pied de page sur Android 2.3.3
  • Batterie Android dans SDK
  • Comment puis-je voir quels wakelocks sont actifs
  • 5 Solutions collect form web for “SwipeRefreshLayout – faites glisser vers le bas pour actualiser, mais ne pas déplacer la vue vers le bas”

    Vous essayez de cette façon

    listView.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { boolean enable = false; if(listView != null && listView.getChildCount() > 0){ // check if the first item of the list is visible boolean firstItemVisible = listView.getFirstVisiblePosition() == 0; // check if the top of the first item is visible boolean topOfFirstItemVisible = listView.getChildAt(0).getTop() == 0; // enabling or disabling the refresh layout enable = firstItemVisible && topOfFirstItemVisible; } swipeRefreshLayout.setEnabled(enable); }}); 

    Ce code ne fonctionne pas si listView dispose de paddingTop

    Après mon essai et mon erreur, j'ai trouvé une solution de

    http://www.dailydevbook.de/android-swiperefreshlayout-without-overscroll/

    Pour les personnes qui peuvent implémenter SwipeRefreshLayout, afin de l'atteindre


    ÉTAPE 1: TELECHARGER android-support v4 (Open Source) de github

    • Android-support v4 – Lien de téléchargement

    ÉTAPE 2: COPIE après la classe java dans votre projet src

    • SwipeRefreshLayout
    • SwipeProgressBar
    • BakedBezierInterpolator

    Note1- (Refactor SwipeRefreshLayout to mySwipeRefreshLayout pour éviter de se confondre avec l'original) note2- (Corrigez ces classes et utilisez la source l'une de l'autre au lieu de v4)

    ÉTAPE 3: UTILISATION DU CODE DE MISE À JOUR

    • MySwipeRefreshLayout au lieu de
    • SwipeRefreshLayout

    ÉTAPE 4: UTILISATION DE LA MISE À JOUR

    • Com.yourpackage.mySwipeRefreshLaout au lieu de
    • Android.support.v4.widget.SwipeRefreshLayout

    ÉTAPE 5: Dans votre mySwipeRefreshLayout.java, trouvez et modifiez- vous un code suivant

     private void updateContentOffsetTop ( int targetTop) { final int currentTop = mTarget.getTop (); if (targetTop> mDistanceToTriggerSync) { targetTop = ( int ) mDistanceToTriggerSync; } else if (targetTop < 0 ) { targetTop = 0 ; } // SetTargetOffsetTopAndBottom (targetTop - currentTop); setTargetOffsetTopAndBottom ( 0 ); // MOD: Prevent Scroll Down Animation } 

    Merci à Jongz Puangput pour la solution de contournement, mais je souhaite suggérer une autre solution, que je trouve plus simple.

    Afin d'éviter la suppression de l'enfant de SwipeRefreshLayout, vous pouvez fournir votre propre vision de l'enfant avec offsetTopAndBottom méthode overriden offsetTopAndBottom comme ceci:

     public class FixedRelativeLayout extends RelativeLayout { ... @Override public void offsetTopAndBottom(int offset) { // Ignoring movement from SwipeRefreshLayout super.offsetTopAndBottom(0); } } 

    Cela fonctionne pour moi, j'espère que cela aidera quelqu'un.

    J'étais également confronté à la même question. essaye ça:

     guidesList.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { int topRowVerticalPosition = (guidesList == null || guidesList.getChildCount() == 0) ? 0 : guidesList.getChildAt(0).getTop(); swipeContainer.setEnabled(firstVisibleItem == 0 && topRowVerticalPosition >= 0); } }); 

    Vous pouvez découvrir la vue du recycleur actuellement en haut et en sachant que vous pouvez désactiver ou activer SwipeRefreshLayout, permettez-moi de donner un exemple

    Disons que vous utilisez le gestionnaire de mise en page linéaire ou la grille, puis vous pouvez trouver la position du recycleur à partir de là

      LinearLayoutManager mLayoutManager; if (mColumnCount <= 1) { mLayoutManager = new LinearLayoutManager(getBaseContext()); } else { mLayoutManager = new GridLayoutManager(getBaseContext(), mColumnCount); } recyclerAdapter = new RecyclerViewAdapter(allData); mRecycler.setAdapter(recyclerAdapter); mRecycler.setLayoutManager(layoutManager); if (mLayoutManager.findFirstCompletelyVisibleItemPosition() == 0) { swipeRefreshLayout.setEnabled(true); } else{ swipeRefreshLayout.setEnabled(false); } 

    Donc votre rouleau de recyclage fonctionnera bien et, si vous atteignez le haut, le swipeRefreshLayout gère l'événement de rafraîchissement …

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.