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
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
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
ÉTAPE 4: UPDATE LAYOUT utiliser
É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
}
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
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.
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);
}
});
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 ...