Rimuovi la list di articoli con Slide – Like Gmail

Sto sviluppando un'applicazione con un elenco di negozio in una list. Ho bisogno che quando faccio avanzare l'elemento di listview a destra (o sinistra), questo elemento dovrebbe essere eliminato dall'elenco.

Ho la mia list e ho solo bisogno della function per farlo.

  • Badge su Android TabHost
  • GpsStatus.Listener funziona solo se il GPS è acceso
  • Utilizzando jBCrypt alle password di salvataggio in App Android provoca un lungo appendere
  • Imansible istanziare il frammento
  • ListView personalizzato con la data come SectionHeader (utilizzato SimpleCursorAdapter personalizzato)
  • Android: animation delle modifiche al contenuto di GridView
  • Grazie in anticipo.

  • Come mostrare la tastiera Android con la modalità dei simboli per impostazione predefinita?
  • Attività ciclo di vita contemporaneamente
  • Chiamata automatica della casella di controllo su CheckedChange quando scorrimento listview scroll?
  • OkHttp come registrare il corpo di richiesta
  • intento android per sdcard pronto
  • Come mantenere una connessione Bluetooth quando Sphero è sincronizzato e utilizzo diverse attività
  • 4 Solutions collect form web for “Rimuovi la list di articoli con Slide – Like Gmail”

    Questo è come realizzo questo effetto. Abbiamo un ListView lvSimple e aggiungiamo onTouchListener al nostro lvSimple . Questo è il mio codice di lavoro.

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

    where la function FunctionDeleteRowWhenSlidingLeft() chiama quando scorre a sinistra, FunctionDeleteRowWhenSlidingRight() – a destra rispettivamente. In questa function è necessario il codice di incolla per l'animation.

    La risposta di Android-Developer indica il codice di Roman Nurik in gist.github.com . Questo codice è obsoleto. Utilizza questo Swipe per smantellare l'ascoltatore nel suo progetto open source di Dash Clock .

    Ci sono alcune cose da sapere, prima di utilizzare il codice in Gist.github.com.

    1. Il codice obsoleto in gist.Github è molto sensibile ai tocchi. Se continui a toccare un elemento nel ListView, verrà eliminato. Nel codice aggiornato, ha fissato la sensibilità al lancio.
    2. Questo listener non funziona bene se si dispone di divisori dichiarati in ListView. Se si desidera dividere, dichiararli nel layout ListItem.
    3. Questo codice è ancora in beta . Caveat emptor.

    Quindi consiglio di utilizzare il codice aggiornato. Qui puoi trovare la fonte aggiornata.

    Un'altra opzione che si dovrebbe considerare è quella di utilizzare la libreria EnhancedListView di Tim Roes. [Aggiornamento – 8/1/2015] Con l'introduzione di RecycleView questa libreria è stata deprecata.

    Il suddetto ascoltatore SwipeToDismiss di Roman Nurik richiede il livello API 12 o superiore. Jake Wharton ha portto questo codice per supportre tutti i livelli di API in SwipeToDismissNOA .

    Tim Roes ha esteso questa libreria per supportre anche la function Undo .

    Ho fatto una risposta utilizzando quello che ha scritto macloving. Per ora sta funzionando, ma funziona solo se tutti i tuoi bambini hanno la stessa altezza.

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

    Le animazioni hanno questa function:

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

    Sto provando questo, e fino ad ora non ho visto errori, se qualcuno potrebbe provare pure sarebbe bello.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.