es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo crear una vista personalizada en una lista para tener la funcionalidad de “deslizar un mensaje para responder en WhatsApp”?

Tengo una lista de elementos en vista de lista, quiero mostrar el elemento en el que el usuario desliza hacia la izquierda, en un nuevo fragmento o actividad como un textview. Quiero que toda la lista se anime y se mueva un poco hacia la izquierda como si hubiera sido arrastrada hacia la izquierda con el dedo. Quiero ejecutar lo mismo utilizando vistas personalizadas.

referencia de imagen

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución

    Para lograr la funcionalidad deseada, podemos seguir los siguientes pasos:

    1. Crear una vista personalizada que extienda ListView.
    2. Sobrescribir el método onTouchEvent para escuchar los desplazamientos.
    3. Cuando el usuario realiza un desplazamiento hacia la izquierda, podemos obtener la posición del elemento deslizado y mostrar su texto en un nuevo fragmento o actividad.
    4. Para animar la lista, podemos usar ObjectAnimator para animar la propiedad translationX de los elementos de la lista.

    Aquí tienes un ejemplo de implementación de la vista personalizada:

    public class SwipeListView extends ListView {
    
        private float startX;
        private boolean isSwiping = false;
    
        public SwipeListView(Context context) {
            super(context);
        }
    
        public SwipeListView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public SwipeListView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    startX = event.getX();
                    isSwiping = false;
                    break;
                case MotionEvent.ACTION_MOVE:
                    if (!isSwiping && Math.abs(event.getX() - startX) > ViewConfiguration.get(getContext()).getScaledTouchSlop()) {
                        // se detectó un desplazamiento horizontal
                        isSwiping = true;
                    }
                    if (isSwiping) {
                        int position = pointToPosition((int) event.getX(), (int) event.getY());
                        if (position != INVALID_POSITION) {
                            View itemView = getChildAt(position - getFirstVisiblePosition());
                            float translationX = event.getX() - startX;
                            itemView.setTranslationX(translationX);
                        }
                    }
                    break;
                case MotionEvent.ACTION_UP:
                    if (isSwiping) {
                        int position = pointToPosition((int) event.getX(), (int) event.getY());
                        if (position != INVALID_POSITION) {
                            // mostrar el texto del elemento deslizado en un nuevo fragmento o actividad
                            String itemText = getItemAtPosition(position).toString();
                            // restablecer la traducción de los elementos de la lista
                            ObjectAnimator animator = ObjectAnimator.ofFloat(getChildAt(position - getFirstVisiblePosition()), "translationX", 0);
                            animator.setDuration(200);
                            animator.start();
                        }
                    }
                    break;
                case MotionEvent.ACTION_CANCEL:
                    if (isSwiping) {
                        int position = pointToPosition((int) event.getX(), (int) event.getY());
                        // restablecer la traducción de los elementos de la lista
                        ObjectAnimator animator = ObjectAnimator.ofFloat(getChildAt(position - getFirstVisiblePosition()), "translationX", 0);
                        animator.setDuration(200);
                        animator.start();
                    }
                    break;
            }
            return super.onTouchEvent(event);
        }
    }
    

    En el código anterior, escuchamos los eventos ACTION_DOWN, ACTION_MOVE, ACTION_UP y ACTION_CANCEL para detectar los desplazamientos. Cuando el usuario desliza hacia la izquierda un elemento, animamos su propiedad translationX para moverlo hacia la izquierda. Cuando el usuario suelta el desplazamiento, detectamos la posición del elemento deslizado y mostramos su texto en un nuevo fragmento o actividad. Finalmente, utilizamos ObjectAnimator para restablecer la traducción de todos los elementos de la lista.

    Para usar esta vista personalizada en tu proyecto, reemplaza la etiqueta <listview> en tu diseño XML con <com.example.swipelistview> (o el paquete y nombre de clase que hayas utilizado para la vista personalizada). Por ejemplo:

    <com.example.swipelistview android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent"></com.example.swipelistview>
    

    Nota: Este es solo un ejemplo básico para demostrar el enfoque y puede requerir algunas modificaciones para adaptarse a tu caso de uso específico.</com.example.swipelistview>

Comments are closed.