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

  • Création de l'émulateur Galaxy S4
  • Comment obtenir des données d'une autre activité dans Android?
  • Comment récupérer un noeud spécifique à partir de la base de données FireBase dans Android
  • Ensemble de compatibilité Android et getLoaderManager ()
  • Phonegap Android et satellite GPS
  • Erreur: la configuration avec le nom 'défaut' n'est pas trouvée dans Android Studio
  • Merci – J'utilise SwipeRefreshLayout

  • Dessiner un cercle de rayon sur la vue de la carte dans Android
  • Déplacement de l'image avec événement tactile
  • Modifier la hauteur de disposition par programmation, ClassCastException?
  • Qu'est-ce que cela signifie pour fuir une connexion de service?
  • Android: streaming de la caméra en tant que mjpeg
  • Quelle est la manière proposée de mettre en œuvre des superpositions dans v2 de l'API Google Maps Google Android?
  • 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.