Desplazamiento por Android en la lista

¿Alguien tiene un ejemplo simple de ListActivity que muestra visualizaciones de texto en una columna y cuando desliza de izquierda a derecha, ve esa fila en una vista nueva? Esto sería para decir editar los datos de esa fila o mostrar información más detallada en esa fila. No hagas referencia al shogun de código u otros sitios como he googled y no he visto esto contestado.

4 Solutions collect form web for “Desplazamiento por Android en la lista”

Tuve el mismo problema y no encontré mi respuesta aquí.

Quise detectar una acción del golpeo en el artículo de ListView y marcarlo como golpeado, mientras que continúo apoyando OnItemClick y OnItemLongClick.

Aquí está mi solución:

1ª La clase SwipeDetector:

import android.util.Log; import android.view.MotionEvent; import android.view.View; public class SwipeDetector implements View.OnTouchListener { public static enum Action { LR, // Left to Right RL, // Right to Left TB, // Top to bottom BT, // Bottom to Top None // when no action was detected } private static final String logTag = "SwipeDetector"; private static final int MIN_DISTANCE = 100; private float downX, downY, upX, upY; private Action mSwipeDetected = Action.None; public boolean swipeDetected() { return mSwipeDetected != Action.None; } public Action getAction() { return mSwipeDetected; } @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: downX = event.getX(); downY = event.getY(); mSwipeDetected = Action.None; return false; // allow other events like Click to be processed case MotionEvent.ACTION_UP: upX = event.getX(); upY = event.getY(); float deltaX = downX - upX; float deltaY = downY - upY; // horizontal swipe detection if (Math.abs(deltaX) > MIN_DISTANCE) { // left or right if (deltaX < 0) { Log.i(logTag, "Swipe Left to Right"); mSwipeDetected = Action.LR; return false; } if (deltaX > 0) { Log.i(logTag, "Swipe Right to Left"); mSwipeDetected = Action.RL; return false; } } else if (Math.abs(deltaY) > MIN_DISTANCE) { // vertical swipe // detection // top or down if (deltaY < 0) { Log.i(logTag, "Swipe Top to Bottom"); mSwipeDetected = Action.TB; return false; } if (deltaY > 0) { Log.i(logTag, "Swipe Bottom to Top"); mSwipeDetected = Action.BT; return false; } } return false; } return false; } } 

2º Utilizo la clase de detector de desplazamiento en la vista de lista:

  final ListView lv = getListView(); final SwipeDetector swipeDetector = new SwipeDetector(); lv.setOnTouchListener(swipeDetector); lv.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (swipeDetector.swipeDetected()){ // do the onSwipe action } else { // do the onItemClick action } } }); lv.setOnItemLongClickListener(new OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view,int position, long id) { if (swipeDetector.swipeDetected()){ // do the onSwipe action } else { // do the onItemLongClick action } } }); 

De esta manera puedo soportar 3 acciones – deslizar, haga clic, haga clic en largo y puedo usar la información del elemento ListView.

AÑADIDO DESPUÉS:

Desde ListView captura una acción de desplazamiento, a veces es difícil de deslizar. Para corregirlo, hice el siguiente cambio a SwipeDetector.onTouch:

 public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: { downX = event.getX(); downY = event.getY(); mSwipeDetected = Action.None; return false; // allow other events like Click to be processed } case MotionEvent.ACTION_MOVE: { upX = event.getX(); upY = event.getY(); float deltaX = downX - upX; float deltaY = downY - upY; // horizontal swipe detection if (Math.abs(deltaX) > HORIZONTAL_MIN_DISTANCE) { // left or right if (deltaX < 0) { Log.i(logTag, "Swipe Left to Right"); mSwipeDetected = Action.LR; return true; } if (deltaX > 0) { Log.i(logTag, "Swipe Right to Left"); mSwipeDetected = Action.RL; return true; } } else // vertical swipe detection if (Math.abs(deltaY) > VERTICAL_MIN_DISTANCE) { // top or down if (deltaY < 0) { Log.i(logTag, "Swipe Top to Bottom"); mSwipeDetected = Action.TB; return false; } if (deltaY > 0) { Log.i(logTag, "Swipe Bottom to Top"); mSwipeDetected = Action.BT; return false; } } return true; } } return false; } 

Aquí hay un fragmento que utilizo para detectar swipes. A continuación, puede utilizar un viewflipper para cambiar la vista.

  @Override public boolean onTouchEvent(MotionEvent event) { if (gestureDetector.onTouchEvent(event)) { return true; } else { return false; } } private static final int SWIPE_MIN_DISTANCE = 30; private static final int SWIPE_MAX_OFF_PATH = 250; private static final int SWIPE_THRESHOLD_VELOCITY = 200; class MyGestureDetector extends SimpleOnGestureListener { @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { try { if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) return false; // right to left swipe if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { leftFling(); } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { rightFling(); } } catch (Exception e) { // nothing } return false; } } 

Aquí está una versión muy simplificada usando los dos oyentes (onTouch para la detección del golpe, y onClickIem para la detección del tecleo del artículo) usando el indicador del isSwipe para parar el onClickItemListener hasta que su confirmado que no era un golpe

Detectar el clic
Teniendo en cuenta que no es un golpe primero

  listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { if(!isSwipe) { adapter.increase(arg2); adapter.notifyDataSetChanged(); } } }); 

Detectar el golpe

  listView.setOnTouchListener(new OnTouchListener() { private int action_down_x = 0; private int action_up_x = 0; private int difference = 0; @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: action_down_x = (int) event.getX(); isSwipe=false; //until now break; case MotionEvent.ACTION_MOVE: if(!isSwipe) { action_up_x = (int) event.getX(); difference = action_down_x - action_up_x; if(Math.abs(difference)>50) { Log.d("action","action down x: "+action_down_x); Log.d("action","action up x: "+action_up_x); Log.d("action","difference: "+difference); //swipe left or right if(difference>0){ //swipe left Log.d("action","swipe left"); adapter.decrease(selectedItem); adapter.notifyDataSetChanged(); } else{ //swipe right Log.d("action","swipe right"); } isSwipe=true; } } break; case MotionEvent.ACTION_UP: Log.d("action", "ACTION_UP - "); action_down_x = 0; action_up_x = 0; difference = 0; break; } return false; //to allow the clicklistener to work after } }) 

Si desea mostrar algunos botones con acciones cuando un elemento de lista es swipe son un montón de bibliotecas en Internet que tienen este comportamiento. Implementé la biblioteca que encontré en Internet y estoy muy satisfecho. Es muy simple de usar y muy rápido. He mejorado la biblioteca original y he añadido un nuevo oyente de clics para el clic de artículo. También agregué la biblioteca impresionante de la fuente ( http://fortawesome.github.io/Font-Awesome/ ) y ahora usted puede simplemente agregar un nuevo título del artículo y especificar el nombre del icono de la fuente impresionante.

Aquí está el enlace github

  • TextView ClickableSpan estilo para estado pulsado
  • La barra de acciones de Android TextView funciona de forma inconsistente
  • Cómo agregar borde a un texto en textview android
  • ¿Cómo obtener el nombre de la familia fontFamily de TextView?
  • Android: ¿Cómo hago bloques no rompibles en TextView?
  • Imprimir unicode personaje Android TextView
  • TextView.setText (Android) está causando accidentes .. alguna idea ¿por qué?
  • Android y la velocidad de desplazamiento de la marquesina horizontal de TextView
  • Cómo insertar texto en textview en android
  • Toque las coordenadas en la vista de texto
  • ¿Puedo establecer un color de texto para los enlaces dentro de una vista de texto?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.