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.
- Vista de lista de Android Giros de derecha / izquierda como registros de llamadas
- Cómo poner ViewPager verticalmente swiped en un ViewPager horizontalmente barrido
- Android: en el interruptor de desplazamiento entre Vistas / Actividades / Fragmentos
- Android - Detección de gestos (deslizar hacia arriba / hacia abajo) en una vista determinada
- SimpleOnGestureListener código no funciona en Android 2.2
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.
- Desplazamiento no funciona en android ViewPager con FragmentPagerAdapter
- Cómo detectar el gesto de desplazamiento de la vista web con el zoom multitáctil habilitado con una aleta
- ¿Cómo implementar un gesto de deslizamiento entre fragmentos?
- Cómo buscar Android ViewFlipper Ejemplo con varias WebViews
- Simple gesto de desplazamiento a la actividad tutorial?
- No se puede implementar el deslizamiento + comportamiento de desplazamiento en el panel deslizante con ListView en Android
- Deslice con jQuery Mobile 1.2, PhoneGap 2.1 y Android 4.0.4 no funcionan correctamente
- RecyclerView ItemTouchHelper borrar eliminar animación
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?
- ¿Por qué mi interfaz de usuario de Android actúa como falsa cuando intento seleccionar texto?
- Uso del modo de host USB de 3.1 con Arduino