6

J'ai mis en place une classe d'écoute pour détecter la fin de vue de défilement se référant le lien https://gist.github.com/marteinn/9427072onScrollChanged feu plusieurs fois pour la fin de défilement dans ScrollView

public class ResponsiveScrollView extends ScrollView { 

private OnBottomReachedListener listener; 

public ResponsiveScrollView(Context context) { 
    super(context); 
} 

@Override 
protected void onScrollChanged(int l, int t, int oldl, int oldt) { 
    View view = getChildAt(getChildCount()-1); 
    int diff = view.getBottom()-(getHeight()+getScrollY()); 
    if (diff == 0 && listener!= null) { 
     listener.onBottomReached(this); 
    } 
    super.onScrollChanged(l, t, oldl, oldt); 
} 

public OnBottomReachedListener getBottomChangedListener() { 
     return listener; 
} 

public void setBottomReachesListener(OnBottomReachedListener onBottomReachedListener) { 
    this.listener = onBottomReachedListener; 
} 

public interface OnBottomReachedListener { 
    public void onBottomReached(View view); 
    } 
} 

Listener est réglé sur ScrollView:

scrollView.setBottomReachesListener(new GenericScrollListerner(this)); 

Mon GenericScrollListerner Classe:

public class GenericScrollListerner implements ResponsiveScrollView.OnBottomReachedListener { 
private Context mContext; 

public GenericScrollListerner(Context context) { 
    this.mContext = context; 
} 

@Override 
public void onBottomReached(View view) { 
    Log.d("ScrollView","Scroll end"); 
    String tag = (String) view.getTag(); 
    Toast.makeText(mContext, "Scroll end with tag" +tag, Toast.LENGTH_SHORT).show(); 
} 

Mon problème est que onBottomReached tire deux fois la plupart du temps. Comment gérer ce problème ???

Répondre

1

une réponse sans tweak.

Extend défilante personnalisée avec 'NestedScrollView' au lieu de ScrollView

public class ResponsiveScrollView extends NestedScrollView { 

private OnBottomReachedListener listener; 

public ResponsiveScrollView(Context context) { 
    super(context); 
} 

@Override 
protected void onScrollChanged(int l, int t, int oldl, int oldt) { 
    View view = getChildAt(getChildCount()-1); 
    int diff = view.getBottom()-(getHeight()+getScrollY()); 
    if (diff == 0 && listener!= null) { 
     listener.onBottomReached(this); 
    } 
    super.onScrollChanged(l, t, oldl, oldt); 
} 

public OnBottomReachedListener getBottomChangedListener() { 
     return listener; 
} 

public void setBottomReachesListener(OnBottomReachedListener onBottomReachedListener) { 
    this.listener = onBottomReachedListener; 
} 

public interface OnBottomReachedListener { 
    public void onBottomReached(View view); 
    } 
} 

Le code ci-dessus fonctionne

4

Cela se produit en raison d'un dépassement excessif. S'il vous plaît ajoutez la ligne suivante dans scrollview xml déclaration

android:overScrollMode="never" 

Si le problème enfin, je trouve utiliser persistez alors le tweak suivant

@Override 
    protected void onScrollChanged(int l, int t, int oldl, int oldt) { 
     View view = getChildAt(getChildCount() - 1); 
     int diff = view.getBottom() - (getHeight() + getScrollY()); 
     if (diff == 0 && listener != null && !stopTwice) { 
      stopTwice=true; 
      listener.onBottomReached(this); 
     }else{ 
      stopTwice=false; 
     } 
     super.onScrollChanged(l, t, oldl, oldt); 
    } 
+0

Merci. Cela fonctionne –

+0

Lequel a travaillé? déclaration XML ou le tweak? @remyathekkuvettil – Nizam

+0

tweak travaillé pour moi @Nizam –