web-dev-qa-db-fra.com

SwipeRefreshLayout - Glissez vers le bas pour actualiser mais pas déplacer la vue vers le bas

C'est possible ?? comme dit le titre

glissez vers le bas pour actualiser la mise en page mais collez la mise en page et ne la déplacez pas le long de la rafale

Merci - j'utilise SwipeRefreshLayout

11
Jongz Puangput

Après mes essais et mes erreurs, j’ai trouvé une solution de

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

Pour les personnes qui peuvent implémenter SwipeRefreshLayout, afin de le réaliser


ÉTAPE 1: TÉLÉCHARGER Android-support v4 (Open Source) à partir de github

ÉTAPE 2: COPIER la classe Java suivante dans votre src de projet

  • SwipeRefreshLayout
  • SwipeProgressBar
  • BakedBezierInterpolator

note1- (Refactor SwipeRefreshLayout à mySwipeRefreshLayout pour éviter toute confusion avec l'original) note2- (Corrigez ces classes et utilisez le source l'une de l'autre au lieu de v4)

ÉTAPE 3: UPDATE CODE utiliser 

  • mySwipeRefreshLayout au lieu de 
  • SwipeRefreshLayout

ÉTAPE 4: UPDATE LAYOUT utiliser

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

ÉTAPE 5: Dans votre mySwipeRefreshLayout.Java, trouvez et remplacez par 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
    }
12
Jongz Puangput

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 a paddingTop

23
Cabezas

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

Pour éviter de dériver l'enfant de SwipeRefreshLayout, vous pouvez fournir votre propre vue enfant avec une 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, espérons que cela aidera n'importe qui.

4
Alex Vasilkov

Je faisais également face au même problème. 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);
    }
});
4
Noman

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

disons que vous utilisez un gestionnaire de disposition linéaire ou une grille, vous pouvez alors 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);
        }

afin que votre recycleur fonctionne correctement et si vous atteignez le sommet, swipeRefreshLayout gère l'événement d'actualisation ...

0
Angga Ari Wijaya