81 votes

Détecter la fin de ScrollView

J'ai une application, qui a une Activité qui utilise un ScrollView. J'ai besoin de détecter lorsque l'utilisateur arrive en bas de la ScrollView. J'ai fait quelques googleing et j'ai trouvé cette page où est expliqué. mais, dans l'exemple, que les mecs s'étend le ScrollView. Comme je l'ai dit, je prolonger l'Activité et DOIT s'étendre à l'Activité.

Alors, j'ai dit "ok, nous allons essayer de faire une classe personnalisée d'étendre le ScrollView, remplacer la onScrollChanged() la méthode, de détecter la fin du rouleau, et d'agir en conséquence".

Je l'ai fait, mais cette ligne:

scroll=(ScrollViewExt) findViewById(R.id.scrollView1);

il jette un java.lang.ClassCastException. J'ai changé les balises dans mon XML, mais, évidemment, cela ne fonctionne pas. Mes questions sont: Pourquoi, si ScrollViewExt s'étend le ScrollView, jette à mon visage une ClassCastException? est-il possible de détecter la fin de défilement sans déconner trop?

Merci les gens.

EDIT: Comme promis, voici un morceau de mon XML qui compte:

<ScrollView
        android:id="@+id/scrollView1"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >


        <WebView
            android:id="@+id/textterms"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center_horizontal"
            android:textColor="@android:color/black" />

    </ScrollView>

J'ai changé depuis TextView de WebView pour être en mesure de justifier le texte à l'intérieur. Ce que je veux réaliser est le "bouton" Accepter "n'est pas activée jusqu'à ce que les termes du contrat sont entièrement lu de chose". Mon extension de classe est appelée ScrollViewExt. Si je change le tag "ScrollView" pour "ScrollViewExt" il jette un "android.vue.InflateException: Binaire dans le fichier XML de la ligne #44: Erreur de gonflage de classe ScrollViewExt", parce qu'il ne comprend pas la balise ScrollViewText. Je ne pense pas qu'il a une solution...

Merci pour vos réponses!

112voto

Fustigador Points 1346

Il l'a fait!

Côté de le fixer Alexandre de bien vouloir me fournir, j'ai dû créer une Interface:

public interface ScrollViewListener {
    void onScrollChanged(ScrollViewExt scrollView, 
                         int x, int y, int oldx, int oldy);
}

Ensuite, j'ai dû remplacer la OnScrollChanged méthode de ScrollView dans mon ScrollViewExt:

public class ScrollViewExt extends ScrollView {
    private ScrollViewListener scrollViewListener = null;
    public ScrollViewExt(Context context) {
        super(context);
    }

    public ScrollViewExt(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public ScrollViewExt(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setScrollViewListener(ScrollViewListener scrollViewListener) {
        this.scrollViewListener = scrollViewListener;
    }

    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);
        if (scrollViewListener != null) {
            scrollViewListener.onScrollChanged(this, l, t, oldl, oldt);
        }
    }
}

Maintenant, comme Alexandre dit, mettre le nom du package dans la balise XML (de ma faute), à faire mon Activité de classe implémente l'interface créée avant, et ensuite, mettre tout cela ensemble:

scroll = (ScrollViewExt) findViewById(R.id.scrollView1);
scroll.setScrollViewListener(this);

Et dans la méthode OnScrollChanged, à partir de l'interface...

@Override
public void onScrollChanged(ScrollViewExt scrollView, int x, int y, int oldx, int oldy) {
    // We take the last son in the scrollview
    View view = (View) scrollView.getChildAt(scrollView.getChildCount() - 1);
    int diff = (view.getBottom() - (scrollView.getHeight() + scrollView.getScrollY()));

    // if diff is zero, then the bottom has been reached
    if (diff == 0) {
        // do stuff
    }
}

Et cela a fonctionné!

Merci beaucoup pour votre aide, Alexandre!

10voto

Alexandre B. Points 314

MODIFIER

Avec le contenu de votre XML, je peux voir que vous utilisez un ScrollView. Si vous souhaitez utiliser votre affichage personnalisé, vous devez écrire des com.votre.packagename.ScrollViewExt et vous serez capable de l'utiliser dans votre code.

<com.your.packagename.ScrollViewExt
    android:id="@+id/scrollView1"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <WebView
        android:id="@+id/textterms"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center_horizontal"
        android:textColor="@android:color/black" />

</com.your.packagename.ScrollViewExt>

EDIT DE FIN

Pourriez-vous poster le contenu du fichier xml ?

Je pense que vous pouvez tout simplement ajouter un défilement de l'auditeur et de vérifier si le dernier élément a montré est la dernière de l'une à partir de la liste comme :

mListView.setOnScrollListener(new OnScrollListener() {      
    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        // TODO Auto-generated method stub      
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
            int visibleItemCount, int totalItemCount) {
        // TODO Auto-generated method stub
        if(view.getLastVisiblePosition()==(totalItemCount-1)){
            //dosomething
        }
    }
});

2voto

Willi Points 11

Pour déterminer si vous êtes à la fin de votre ScrollView personnalisé, vous pouvez également utiliser une variable membre et stocker la dernière position y. Ensuite, vous pouvez comparer la dernière position y avec la position de défilement actuelle.

 private int scrollViewPos;

...

@Override
public void onScrollChanged(ScrollViewExt scrollView, int x, int y, int oldx, int oldy) {

   //reached end of scrollview
   if (y > 0 && scrollViewPos == y){
      //do something
   }

   scrollViewPos = y;
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X