Android ListView Deslizar hacia la derecha y hacia la izquierda para aceptar y rechazar

Quiero desarrollar la vista de lista en que quiero, cuando deslizo de izquierda a derecha, en la esquina izquierda mostrar un icono de aceptar (verdadero) (no clicable – mostrar sólo el cambio de color cuando deslizar de izquierda a derecha) como siguiente captura de pantalla,

Introduzca aquí la descripción de la imagen

Cuando deslizo todo de izquierda a derecha acepto (en que llamé acepta api), y cuando deslizo de derecha a izquierda se mostrará así,

Introduzca aquí la descripción de la imagen

Esto se hace en el iphone, pero no exactamente encontrar cómo hacer esto en Android, i mucho google, pero no encontrar exactamente lo que quiero,

Intento el siguiente ejemplo: http://www.tutecentral.com/android-swipe-listview/

Pero en que cuando deslizo de izquierda a derecha y de derecha a izquierda mismo onOpened (..) método llamado así que confunde a: cuando llamar aceptar y rechazar api porque el mismo método llamado cuando cualquier tipo de golpe.

Y también quiero cuando simplemente paseo izquierda-derecha o derecha-izquierda sólo que el tiempo aceptar la imagen (lado izquierdo) y rechazar (rechazar la imagen del lado derecho) de la pantalla, cuando tomo dedo hasta que se debe mostrar todo listview (no ambos side image ).

Así que cualquier persona por favor me ayude a Cómo hacer esto.

Mi pregunta es algo confuso y también con algo de gramática baja, pero no sé cómo explicar toda la animación, así que intento escribir como arriba,

Si alguien me ayuda muy apreciada.

6 Solutions collect form web for “Android ListView Deslizar hacia la derecha y hacia la izquierda para aceptar y rechazar”

Solución número 1:

Tienes que hacer lo siguiente para llegar a "cerca" de tu funcionalidad,

Envuelva el adaptador de su ListView

Como sigue:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Create an Adapter for your content String[] content = new String[20]; for (int i=0;i<20;i++) content[i] = "Row "+(i+1); ArrayAdapter<String> stringAdapter = new ArrayAdapter<String>( this, R.layout.row_bg, R.id.text, new ArrayList<String>(Arrays.asList(content)) ); // Wrap your content in a SwipeActionAdapter mAdapter = new SwipeActionAdapter(stringAdapter); // Pass a reference of your ListView to the SwipeActionAdapter mAdapter.setListView(getListView()); // Set the SwipeActionAdapter as the Adapter for your ListView setListAdapter(mAdapter); } 

Cree un diseño de fondo para cada dirección de desplazamiento

Me gusta lo siguiente:

  protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Create an Adapter for your content String[] content = new String[20]; for (int i=0;i<20;i++) content[i] = "Row "+(i+1); ArrayAdapter<String> stringAdapter = new ArrayAdapter<String>( this, R.layout.row_bg, R.id.text, new ArrayList<String>(Arrays.asList(content)) ); // Wrap your content in a SwipeActionAdapter mAdapter = new SwipeActionAdapter(stringAdapter); // Pass a reference of your ListView to the SwipeActionAdapter mAdapter.setListView(getListView()); // Set the SwipeActionAdapter as the Adapter for your ListView setListAdapter(mAdapter); // Set backgrounds for the swipe directions mAdapter.addBackground(SwipeDirections.DIRECTION_FAR_LEFT,R.layout.row_bg_left_far) .addBackground(SwipeDirections.DIRECTION_NORMAL_LEFT,R.layout.row_bg_left) .addBackground(SwipeDirections.DIRECTION_FAR_RIGHT,R.layout.row_bg_right_far) .addBackground(SwipeDirections.DIRECTION_NORMAL_RIGHT,R.layout.row_bg_right); } 

Tienes dos bibliotecas y Ejemplo de la aquí: https://github.com/wdullaer/SwipeActionAdapter

Esto no será exactamente como usted desea, pero espero que esto le ayudará tanto a cumplir con su funcionalidad.

Solución número 2:

La solución 2 consiste en cambiar algún código en su código usado: http://www.tutecentral.com/android-swipe-listview/

I había probar su código desde el enlace http://www.tutecentral.com/android-swipe-listview/ y cambiar algún código y resolver con éxito su problema (su confusión) sobre onOpened (..) método (llamado de izquierda a derecha y viceversa )

Primer cambio:

  1. Archivo de diseño custom_row.xml tiene tres botón swipe_button1 a 3, quitar medio de ellos.

  2. Copiar el siguiente código de la copia para permanecer dos botón:

     <Button android:id="@+id/swipe_button1" android:layout_width="48dp" android:layout_height="48dp" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:background="@drawable/your_accept_image" /> <Button android:id="@+id/swipe_button3" style="@style/MyListButtonAction" android:layout_width="48dp" android:layout_height="48dp" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:background="@drawable/your_reject_image" /> 

Sigue siendo el mismo código para este diseño.

Segundo cambio:

Así que ahora su aceptar y rechazar y el código de la lista está listo, ahora discutir sobre el método onOpened (..).

Solución de confusión 1 – Usted dijo, su método onOpend (…) se llama igual de izquierda a derecha y viceversa

-> sólo para cambiar a continuación:

 public void onOpened(int position, boolean toRight) { if(toRight) { // for left to right your api calling here swipelistview.closeAnimate(position); } else { // for right to left your api calling here swipelistview.closeAnimate(position); } } 

Solución de confusión 2 cuando tomo dedo hacia arriba que debe mostrar los lados de listview o listview entero debe conservar las esquinas por lo que no funciona

-> ya lo he respondido por encima

Llamado swipelistview.closeAnimate (posición); En ambos si otra cosa, esconda la izquierda acepta y rechaza la imagen derecha cuando su su golpe a la izquierda y la derecha encima.

El código final es el siguiente:

Diseño entero de cutom_row.xml

  <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <RelativeLayout android:id="@+id/back" android:layout_width="match_parent" android:layout_height="wrap_content" android:tag="back" > <Button android:id="@+id/swipe_button1" android:layout_width="48dp" android:layout_height="48dp" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:background="@drawable/accept_image" /> <Button android:id="@+id/swipe_button3" style="@style/MyListButtonAction" android:layout_width="48dp" android:layout_height="48dp" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:background="@drawable/reject_image" /> </RelativeLayout> <RelativeLayout android:id="@+id/front" style="@style/MyListFrontContent" android:orientation="vertical" android:tag="front" > <ImageView android:id="@+id/example_image" style="@style/MyListImage" /> <TextView android:id="@+id/example_itemname" style="@style/MyListTitle" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_toRightOf="@id/example_image" /> </RelativeLayout> </FrameLayout> 

Todo MainActivity.java

 public class MainActivity extends Activity { SwipeListView swipelistview; ItemAdapter adapter; List<ItemRow> itemData; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); swipelistview=(SwipeListView)findViewById(R.id.example_swipe_lv_list); itemData=new ArrayList<ItemRow>(); adapter=new ItemAdapter(this,R.layout.custom_row,itemData); swipelistview.setSwipeListViewListener(new BaseSwipeListViewListener() { @Override public void onOpened(int position, boolean toRight) { if(toRight) { // for left to right your api calling here swipelistview.closeAnimate(position); } else { // for right to left your api calling here swipelistview.closeAnimate(position); } } @Override public void onClosed(int position, boolean fromRight) { // close list slide } @Override public void onListChanged() { } @Override public void onMove(int position, float x) { } @Override public void onStartOpen(int position, int action, boolean right) { Log.d("swipe", String.format("onStartOpen %d - action %d", position, action)); } @Override public void onStartClose(int position, boolean right) { Log.d("swipe", String.format("onStartClose %d", position)); } @Override public void onClickFrontView(int position) { Log.d("swipe", String.format("onClickFrontView %d", position)); } @Override public void onClickBackView(int position) { Log.d("swipe", String.format("onClickBackView %d", position)); swipelistview.closeAnimate(position);//when you touch back view it will close } @Override public void onDismiss(int[] reverseSortedPositions) { } }); //These are the swipe listview settings. you can change these //setting as your requirement swipelistview.setSwipeMode(SwipeListView.SWIPE_MODE_BOTH); // there are five swiping modes // swipelistview.setSwipeActionLeft(SwipeListView.SWIPE_ACTION_DISMISS); //there are four swipe actions swipelistview.setSwipeActionRight(SwipeListView.SWIPE_ACTION_REVEAL); swipelistview.setOffsetLeft(convertDpToPixel(0f)); // left side offset swipelistview.setOffsetRight(convertDpToPixel(80f)); // right side offset swipelistview.setAnimationTime(500); // Animation time swipelistview.setSwipeOpenOnLongPress(true); // enable or disable SwipeOpenOnLongPress swipelistview.setAdapter(adapter); for(int i=0;i<10;i++) { itemData.add(new ItemRow("Swipe Item"+ i,getResources().getDrawable(R.drawable.ic_launcher) )); } adapter.notifyDataSetChanged(); } public int convertDpToPixel(float dp) { DisplayMetrics metrics = getResources().getDisplayMetrics(); float px = dp * (metrics.densityDpi / 160f); return (int) px; } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } } 

El otro código y la biblioteca sigue siendo iguales, le ayuda a usted ya otro también, así que goce.

Funcionó para mí … Espero que funcione para usted ..!

Establecer OnTouchListener a listview como

 listview.setOnTouchListener(new OnSwipeTouchListener(getActivity(), listview)); 

La clase OnSwipeTouchListener es la siguiente:

 public class OnSwipeTouchListener implements OnTouchListener { ListView list; private GestureDetector gestureDetector; private Context context; public OnSwipeTouchListener(Context ctx, ListView list) { gestureDetector = new GestureDetector(ctx, new GestureListener()); context = ctx; this.list = list; } public OnSwipeTouchListener() { super(); } @Override public boolean onTouch(View v, MotionEvent event) { return gestureDetector.onTouchEvent(event); } public void onSwipeRight(int pos) { //Do what you want after swiping left to right } public void onSwipeLeft(int pos) { //Do what you want after swiping right to left } private final class GestureListener extends SimpleOnGestureListener { private static final int SWIPE_THRESHOLD = 100; private static final int SWIPE_VELOCITY_THRESHOLD = 100; @Override public boolean onDown(MotionEvent e) { return true; } private int getPostion(MotionEvent e1) { return list.pointToPosition((int) e1.getX(), (int) e1.getY()); } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { float distanceX = e2.getX() - e1.getX(); float distanceY = e2.getY() - e1.getY(); if (Math.abs(distanceX) > Math.abs(distanceY) && Math.abs(distanceX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) { if (distanceX > 0) onSwipeRight(getPostion(e1)); else onSwipeLeft(getPostion(e1)); return true; } return false; } } } 

Echa un vistazo a esta biblioteca, le dará u muy buenos ejemplos y se apunta u a la dirección correcta. Buena suerte.

Por favor, evita el enfoque anterior de lo contrario vas a llenar el controlador de llenado con lógica de vista (algo que tienes que evitar) visita https://github.com/xenione/SwipeLayout hay un fabricante de deslizar con algunos ejemplos

Basado en @Pratibha Sarode solución Lo adapto como sigue con un listview poupulated con un cursoradaptor y una base de datos: En la actividad principal:

  //-- Attach cursor adapter to the ListView lvItems.setAdapter(todoAdapter); /////////////////// Swipe Management lvItems.setOnTouchListener(new OnSwipeList(AfficList.this,lvItems){ public void onSwipeRight(int pos) { AnnonceDbHandler dbHandler = new AnnonceDbHandler(AfficList.this, null, null, 1); String sIdAnn=dbHandler.RechercheIdIndex(pos); //Toast.makeText(AfficList.this, "Right ("+pos+") : "+sIdAnn, Toast.LENGTH_SHORT).show(); dbHandler.deleteAnnonce(sIdAnn, AfficList.this); Cursor NewCursor = dbAnnonces.rawQuery("SELECT * FROM annonces", null); todoAdapter.swapCursor(NewCursor); lvItems.setAdapter(todoAdapter); todoAdapter.notifyDataSetChanged(); } public void onSwipeLeft(int pos) { AnnonceDbHandler dbHandler = new AnnonceDbHandler(AfficList.this, null, null, 1); String sIdAnn=dbHandler.RechercheIdIndex(pos); //Toast.makeText(AfficList.this, "Right ("+pos+") : "+sIdAnn, Toast.LENGTH_SHORT).show(); dbHandler.deleteAnnonce(sIdAnn, AfficList.this); Cursor NewCursor = dbAnnonces.rawQuery("SELECT * FROM annonces", null); todoAdapter.swapCursor(NewCursor); lvItems.setAdapter(todoAdapter); todoAdapter.notifyDataSetChanged(); } }); 

¡Es las líneas de supresión grandes del trabajo con moviment del golpe!

Usando una respuesta en https://stackoverflow.com/a/31094315/2914140 lo hice tan.

 View.OnTouchListener swipeListener = new View.OnTouchListener() { private float dx; @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: dx = v.getX() - event.getRawX(); break; case MotionEvent.ACTION_MOVE: // You can limit x-coordinate. float x = Math.min(event.getRawX() + dx, 0); // x = Math.max(x, ((View) v.getParent()).getWidth() - v.getWidth()); // Scroll if layout is wider than screen. v.animate() .x(x) .setDuration(0) .start(); break; default: return false; } return true; } }; 

En getView de su adaptador escriba:

 @Override public View getView(final int position, View convertView, ViewGroup parent) { final ViewHolder viewHolder; if (convertView == null) { convertView = inflater.inflate(R.layout.item_layout, false); viewHolder = new ViewHolder(convertView); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } // Fill data. final Item item = items.get(position); viewHolder.caption.setText(item.getCaption()); // Set onTouch listener. convertView.setOnTouchListener(swipeListener); return convertView; } 

Creo que lo mismo se puede lograr usando HorizontalScrollView dentro de item_layout.xml.

  • No se puede implantar OnItemClickListener en android-swipelistview
  • Cómo desplazarse y desplazarse hasta el último en Appium
  • Android listview, pase a la acción
  • Android: deslizar el elemento de la lista causa clickOnItem
  • Implementación de 47degree android-swipelistview para desplazar android ListViewItem
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.