web-dev-qa-db-fra.com

Comment détecter Android ListView défilement arrêté?

J'essaie de faire quelque chose après le défilement arrêté.so, j'ai essayé d'utiliser OnScrollListener#onScrollStateChanged(SCROLL_STATE_IDLE) pour détecter lorsque le défilement est arrêté (soit TOUCH_SCROLL or FLING) (à 1,5, il est exécuté comme je m'attends). Mais quand il s'exécute sur 2,0, OnscrollstatCHanged ne peut pas avoir reçu l'événement après avoir relâché le doigt. Certains rappel ou de toute façon pour détecter cet événement?

27
koji lin

Essayez d'utiliser le Seonscrolllistener et implémentez l'OnscrollstatCHanged avec ScrollState == 0 ... Faites ce que vous devez faire ...

setOnScrollListener(new OnScrollListener() {
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        // TODO Auto-generated method stub
    }

    public void onScrollStateChanged(AbsListView view, int scrollState) {
        if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
            Log.i("a", "scrolling stopped...");
        }
    }
});
68
Vidar Vestnes

L'astuce consiste à garder une trace du moment où l'utilisateur tourne et quand ils ne le sont pas. Il semble que cela ressemble à la seule distinction que vous puissiez faire parce que, comme vous l'avez dit, les transitions de défilement avec un doigt au ralenti sont non enregistrées. Voici ce dont je parle:

public void onScrollStateChanged(AbsListView view, int scrollState) {       
    if (scrollState != OnScrollListener.SCROLL_STATE_FLING) {
        flinging = false;
        int count = view.getChildCount();

        for (int i = 0; i < count; i++) {
            View convertView = view.getChildAt(i);
            Recipe recipe = (Recipe) convertView.getTag();
            ImageView image = (ImageView) convertView.findViewById(R.id.icon);

            if (recipe != null && recipe.getImageURL() != null) {
                ImageLoader.loadImage(this, image, recipe.getImageURL());
            }
        }
    } else {
        flinging = true;
    }
}

Et puis dans l'adaptateur ListView:

public View getView(int position, View convertView, ViewGroup parent) {
    // Bunch of code....

    if (!flinging) {
        ImageLoader.loadImage(BrowseRecipes.this, image, recipe.getImageURL());
    }
}

Ainsi, au lieu de réagir au changement de l'auditeur, chargez simplement les images (ou tout ce que vous avez besoin de faire suffisamment de temps), tant qu'il n'y a pas de coup d'œil.

Tout cela est sorti de mon projet ici: https://github.com/pkulak/mealfire_android

7
Phil Kulak