SwipeListView sólo un elemento abierto a la vez

Esta pregunta hace referencia al componente SwipeListView que se encuentra aquí: https://github.com/47deg/android-swipelistview

Después de probar varias implementaciones y arreglos que encontré en la web, decidí modificar las fuentes un poco.

Voy a publicar esto aquí ya que sé que es un problema conocido y todas las versiones que encontré probado tener algunos problemas con el tiempo.

SwipeListViewTouchListener.java ha sufrido los siguientes cambios:

 ... /** * Create reveal animation * * @param view affected view * @param swap If will change state. If "false" returns to the original * position * @param swapRight If swap is true, this parameter tells if movement is toward * right or left * @param position list position */ private void generateRevealAnimate(final View view, final boolean swap, final boolean swapRight, final int position) { int moveTo = 0; if (opened.get(position)) { if (!swap) { moveTo = openedRight.get(position) ? (int) (viewWidth - rightOffset) : (int) (-viewWidth + leftOffset); } } else { if (swap) { moveTo = swapRight ? (int) (viewWidth - rightOffset) : (int) (-viewWidth + leftOffset); } } final boolean aux = !opened.get(position); if(swap) { opened.set(position, aux); openedRight.set(position, swapRight); } animate(view).translationX(moveTo).setDuration(animationTime).setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { swipeListView.resetScrolling(); if (swap) { if (aux) { swipeListView.onOpened(position, swapRight); } else { swipeListView.onClosed(position, openedRight.get(position)); } } // if (aux || !swap) { // resetCell(); // } } }); } ... /** * Close all opened items */ void closeOtherOpenedItems() { if (opened != null && downPosition != SwipeListView.INVALID_POSITION) { int start = swipeListView.getFirstVisiblePosition(); int end = swipeListView.getLastVisiblePosition(); for (int i = start; i <= end; i++) { if (opened.get(i) && i != downPosition) { closeAnimate(swipeListView.getChildAt(i - start).findViewById(swipeFrontView), i); } } } } ... /** * @see View.OnTouchListener#onTouch(android.view.View, * android.view.MotionEvent) */ @Override public boolean onTouch(View view, MotionEvent motionEvent) { ... closeOtherOpenedItems(); view.onTouchEvent(motionEvent); return true; } 

El resto del código no mencionado es el mismo.

Cualquier comentario muy apreciado, estos cambios le impiden tener que implementar el SwipeListViewOnTouchListener en la actividad que infla la lista.

Contras: no cierra la fila abierta por openAnimate()

  BaseSwipeListViewListener swipeListViewListener = new BaseSwipeListViewListener() { int openItem = -1; @Override public void onStartOpen(int position, int action, boolean right) { super.onStartOpen(position, action, right); if (openItem > -1) swipeListView.closeAnimate(openItem); openItem = position; } } 

O mejor manera:

  @Override public void onStartOpen(int position, int action, boolean right) { super.onStartOpen(position, action, right); swipeListView.closeOpenedItems(); } 

Y establezca el listener en la listaVer:

  swipeListView.setSwipeListViewListener(swipeListViewListener); 

Su solución funcionó, pero hay una manera de hacerlo sin afectar el código original:

 swipeListView.setSwipeListViewListener(new BaseSwipeListViewListener() { int openItem = -1; int lastOpenedItem = -1; int lastClosedItem = -1; @Override public void onOpened(int position, boolean toRight) { lastOpenedItem = position; if (openItem > -1 && lastOpenedItem != lastClosedItem) { swipeListView.closeAnimate(openItem); } openItem = position; } @Override public void onStartClose(int position, boolean right) { Log.d("swipe", String.format("onStartClose %d", position)); lastClosedItem = position; } } 

Sin embargo, debe enviar una solicitud de extracción para aplicar su código, ya que podría solucionar el error.

Fuente: https://github.com/47deg/android-swipelistview/issues/46

Si va a modificar la biblioteca swipelistview sí, tengo una solución más sencilla.

Agregue lo siguiente si bloquea a SwipeListViewTouchListener.java en el método onTouch al principio del case MotionEvent.ACTION_DOWN:

 if(lastOpenedPosition != downPosition && opened.get(lastOpenedPosition)) { closeAnimate(lastOpenedPosition); return false; } 

Cree un campo int lastOpenedPosition e int lastOpenedPosition a 0, y en el método generateRevealAnimate dentro del bloque if (aux) agregue:

 lastOpenedPosition = position; 

También añadiría la variable de configuración (en res/values/swipelistview_attrs.xml ) a SwipeListView y lo añadiría al bloque onTouch if, para añadir la capacidad de activar y desactivar esta función. Esto básicamente resulta en si la lista se toca mientras una fila está abierta, que la fila se cerrará. Cuál, imho, es mejor funcionalidad que la fila que cierra solamente después de que usted haya terminado de abrir otra fila.

 swipeListView.setSwipeListViewListener(new BaseSwipeListViewListener() { //... @Override public void onClickBackView(int position) { //DELETE ITEM adapter.notifyDataSetChanged(); swipeListView.closeOpenedItems(); } //... }); 

Sí, el SwipeListView de los códigos originales puede abrir muchos elementos al mismo tiempo. Su segmento de código aquí puede abrir un elemento a la vez? ¿O cuando abre otro artículo, los artículos abiertos serán cerrados?

  • Cómo agregar una vista de desplazamiento a estas codificaciones existentes
  • Desplazamiento Dirección en ViewPager
  • ViewPager dentro de ViewPager
  • Cómo manejar el evento táctil para la vista secundaria en la vista principal
  • Android Studio predeterminado "Actividad con pestañas", cómo pasar a través de fragmentos?
  • Android cómo agregar el gesto de deslizamiento en LinearLayout sin onDown true
  • Necesita ayuda para implementar 47degree Android-SwipeListView
  • Impedir que se active el evento de derivación al deslizar jquerymobile en la vista web de android
  • Implementación de la atracción de Chris Banes para actualizar junto con desplazamiento horizontal en la vista de lista
  • Android deslizar y agregar unidad de fuerza
  • Android de izquierda a derecha solamente
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.