40 votes

Suppression de la liste des éléments avec Slide - Like Gmail

Je développe une application avec une liste de magasins dans une vue de liste. J'ai besoin que lorsque je fais glisser l'article de listview vers la droite (ou la gauche), cet élément doit être supprimé de la liste.

J'ai mon listview et j'ai seulement besoin de la fonction pour le faire.

Merci d'avance.

23voto

Android-Developer Points 6542

Voici un lien qui peut vous montrer / guider comment faire cela : Balayez pour rejeter .

19voto

macloving Points 181

Voici comment je réalise cet effet. Nous avons un ListView lvSimple et nous ajoutons le onTouchListener à notre lvSimple . Voici mon code de travail.

float historicX = Float.NaN, historicY = Float.NaN;
static final int DELTA = 50;
enum Direction {LEFT, RIGHT;}
...
ListView lvSimple = (ListView) findViewById(R.id.linLayout);
...
lvSimple.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                historicX = event.getX();
                historicY = event.getY();
                break;

            case MotionEvent.ACTION_UP:
                if (event.getX() - historicX < -DELTA) {
                    FunctionDeleteRowWhenSlidingLeft();
                    return true;
                }
                else if (event.getX() - historicX > DELTA) {
                    FunctionDeleteRowWhenSlidingRight();
                    return true;
                }
                break;

            default:
                return false;
        }
        return false;
    }
});

où la fonction FunctionDeleteRowWhenSlidingLeft() appelle quand on glisse vers la gauche, FunctionDeleteRowWhenSlidingRight() - à droite respectivement. Dans cette fonction, vous devez coller du code pour l'animation.

6voto

iraSenthil Points 1966

Réponse : par Android-Developer pointe vers le code de Roman Nurik en gist.github.com . Ce code n'est plus à jour. Il utilise cet écouteur Swipe to Dismiss dans son projet open-source. Horloge du tableau de bord .

Il y a certaines choses que vous devez savoir, avant d'utiliser le code dans Gist.github.com.

  1. Le code périmé dans gist.Github est très sensible aux touchers. Si vous continuez à toucher un élément dans la ListView, il sera supprimé. Dans le code mis à jour, il a corrigé la sensibilité au toucher.
  2. Cet écouteur ne fonctionne pas bien si vous avez des séparateurs déclarés en ListView. Si vous voulez des séparateurs, déclarez-les dans la disposition ListItem.
  3. Ce code est toujours en bêta . Caveat emptor.

Je recommande donc d'utiliser le code mis à jour. Vous pouvez trouver la source mise à jour aquí .

5voto

Alex Lipov Points 990

Une autre option que vous devriez envisager est d'utiliser la méthode de Tim Roes EnhancedListView bibliothèque. [Mise à jour - 8/1/2015] Avec l'introduction de RecycleView cette bibliothèque a été dépréciée.

L'écouteur SwipeToDismiss de Roman Nurik, mentionné plus haut, nécessite un niveau d'API 12 ou supérieur. Jake Wharton a porté ce code pour qu'il supporte tous les niveaux d'API dans l'application SwipeToDismissNOA .

Tim Roes a étendu cette bibliothèque pour prendre en charge Annuler également.

0voto

Dinidiniz Points 571

J'ai fait une réponse en utilisant ce que macloving a écrit. Pour l'instant, cela fonctionne, mais seulement si tous vos enfants ont la même hauteur.

listView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    historicX = event.getX();
                    historicY = event.getY();
                    return false;

                case MotionEvent.ACTION_UP:
                    if (listView.getChildAt(0) != null) {
                        int heightOfEachItem = haveListView.getChildAt(0).getHeight();
                        int heightOfFirstItem = -haveListView.getChildAt(0).getTop() + haveListView.getFirstVisiblePosition()*heightOfEachItem;
                        //IF YOU HAVE CHILDS IN LIST VIEW YOU START COUNTING
                        //listView.getChildAt(0).getTop() will see top of child showed in screen
                        //Dividing by height of view, you get how many views are not in the screen
                        //It needs to be Math.ceil in this case because it sometimes only shows part of last view
                        final int firstPosition = (int) Math.ceil(heightOfFirstItem / heightOfEachItem); // This is the same as child #0

                        //Here you get your List position, use historic Y to get where the user went first
                        final int wantedPosition = (int) Math.floor((historicY - haveListView.getChildAt(0).getTop()) / heightOfEachItem) + firstPosition;
                        //Here you get the actually position in the screen
                        final int wantedChild = wantedPosition - firstPosition;
                        //Depending on delta, go right or left
                        if (event.getX() - historicX < -DELTA) {
                            //If something went wrong, we stop it now
                            if (wantedChild < 0 || wantedChild >= List.size()|| wantedChild >= listView.getChildCount()) {

                                return true;
                            }
                            //Start animation with 500 miliseconds of time
                            listView.getChildAt(wantedChild).startAnimation(outToLeftAnimation(500));
                            //after 500 miliseconds remove from List the item and update the adapter.
                            new java.util.Timer().schedule(
                                    new java.util.TimerTask() {
                                        @Override
                                        public void run() {
                                            List.remove(wantedPosition);
                                            updateAdapter();
                                        }
                                    },
                                    500
                            );
                            return true;

                        } else if (event.getX() - historicX > DELTA) {
                            //If something went wrong, we stop it now
                            if (wantedChild < 0 || wantedChild >= List.size() || wantedChild >= listView.getChildCount()) {

                                return true;
                            }
                            //Start animation with 500 miliseconds of time
                            listView.getChildAt(wantedChild).startAnimation(outToRightAnimation(500));
                            //after 500 miliseconds remove from List the item and update the adapter.
                            new java.util.Timer().schedule(
                                    new java.util.TimerTask() {
                                        @Override
                                        public void run() {
                                            List.remove(wantedPosition);
                                            updateAdapter();
                                        }
                                    },
                                    500
                            );
                            return true;

                        }
                    }
                    return true;
                default:
                    return false;
            }
        }
    });

Les animations ont cette fonction :

private Animation outToLeftAnimation(int duration) {
    Animation outtoLeft = new TranslateAnimation(
            Animation.RELATIVE_TO_PARENT, 0.0f,
            Animation.RELATIVE_TO_PARENT, -1.0f,
            Animation.RELATIVE_TO_PARENT, 0.0f,
            Animation.RELATIVE_TO_PARENT, 0.0f);
    outtoLeft.setDuration(duration);
    outtoLeft.setInterpolator(new AccelerateInterpolator());
    return outtoLeft;
}

private Animation outToRightAnimation(int duration) {
    Animation outtoRight = new TranslateAnimation(
            Animation.RELATIVE_TO_PARENT, 0.0f,
            Animation.RELATIVE_TO_PARENT, +1.0f,
            Animation.RELATIVE_TO_PARENT, 0.0f,
            Animation.RELATIVE_TO_PARENT, 0.0f);
    outtoRight.setDuration(duration);
    outtoRight.setInterpolator(new AccelerateInterpolator());
    return outtoRight;
}

J'essaie ceci, et jusqu'à présent je n'ai pas vu d'erreurs, si quelqu'un pouvait essayer aussi, ce serait bien.

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