Estoy desarrollando una aplicación con una tienda de lista en un listview. Necesito que cuando me pase el elemento de listview a la derecha(o izquierda), este tema debería quedar eliminado del listview.

Tengo mi listview y sólo necesita la función para hacerlo.

Gracias de antemano.

  • igual que las tabletas, donde se quita la tarea de la actual lista de tareas al deslizar a la izquierda o a la derecha.?
  • Aquí hay un enlace que puede mostrar / guía de cómo hacerlo : Pase a despedir .
InformationsquelleAutor dmontielfdez | 2013-01-18

4 Comentarios

  1. 19

    Esto es cómo me doy cuenta de este efecto. Tenemos un ListView lvSimple y añadimos onTouchListener a nuestro lvSimple. Este es mi código de trabajo.

    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;
        }
    });

    donde la función FunctionDeleteRowWhenSlidingLeft() está llamando cuando nos deslizante a la izquierda, FunctionDeleteRowWhenSlidingRight() – a la derecha, respectivamente. En esta función se necesita pegar el código para la animación.

    • Ohhhh, después de buscar y depuración para dos días , me ahorra ! Gracias
    • pero, ¿cómo obtener el índice de la presentación de la fila ?!
    • lista.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView padre, View v, int position, long id){ // HACER COSAS AQUÍ SwipedPosition = posición; } });
    • El Pase de la posición sigue siendo el 0 y el primer elemento de la lista se elimina. Cómo obtener la posición del frotis elemento de la vista de lista?
    • podría usted por favor, amplíe su respuesta con la animación de código así?
  2. 6

    Respuesta por Android-Desarrollador de puntos de Roman Nurik del código en gist.github.com. Este código está fuera de fecha. Él utiliza este Pase a Despedir a la escucha en su proyecto de código abierto Dash Clock.

    Hay algunas cosas que usted debe saber, antes de usar el código de Gist.github.com.

    1. El código obsoleto en gist.Github es muy sensible a los toques. Si sigues tocando un elemento en la vista de lista, será eliminado. En la actualización del código que fija la aventura de la sensibilidad.
    2. Este detector no funciona bien si usted tiene divisores declarado en
      ListView. Si desea divisores de declarar en el ListItem diseño.
    3. Este código todavía está en beta. Caveat emptor.

    Por lo que recomendamos el uso del código actualizado. Usted puede encontrar el código fuente actualizado aquí.

    • Estoy utilizando la versión actualizada del código en el link que se te recomienda, pero estoy teniendo un problema en la declaración. Cada vez que llame a la línea de: «nueva SwipeDismissListViewTouchListener.OnDismissCallback() {» viene con, «SwipeDismissListViewTouchListener.OnDismissCallback no puede ser resuelto a un tipo» ¿Alguna idea? No muy seguro de la solución
    • Uso new SwipeDismissListViewTouchListener.DismissCallbacks() lugar
    • github.com/romannurik/Android-SwipeToDismiss/blob/master/src/…
  3. 5

    Otra opción que usted debe considerar es el uso de Tim Huevas del EnhancedListView de la biblioteca. [Actualización – 8/1/2015] Con la introducción de RecycleView esta biblioteca ha dejado de funcionar.

    La mencionada Roman Nurik del SwipeToDismiss escucha requiere de la API de nivel 12 o superior. Jake Wharton portado este código para apoyar a todos los niveles de la API de en SwipeToDismissNOA.

    Tim Huevas extendido esta biblioteca de apoyo Deshacer característica.

    • INFO: EnhancedListView está en desuso.
    • Entonces, ¿qué has estado usando ahora o deslizar el dedo para eliminar? SwipetoDismissNOA o algo más?
  4. 0

    Hice una respuesta con lo que macloving escribió. Por ahora se está trabajando, pero es que sólo funciona si todos sus hijos tienen la misma altura.

    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;
    }
    }
    });

    Las animaciones tienen esta función:

    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;
    }

    Estoy intentando esto, y hasta ahora no he visto errores, si alguien podía tratar así sería bueno.

Dejar respuesta

Please enter your comment!
Please enter your name here