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.

Extender RecyclerView y obtener la posición del elemento seleccionado.

Estoy intentando extender RecyclerView para hacer ciertas modificaciones propias. Esto es lo que tengo actualmente:

public class FeedRecyclerView extends RecyclerView {

private int currentClickedItem = -1;

public FeedRecyclerView(@NonNull Context context) {
    super(context);
    init();
}

public FeedRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    init();
}

public FeedRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init();
}

//Verificar si se hace clic en un elemento de RecyclerView
//Si es así, actualizar "currentClickedItem" a la posición correcta
}

Cuando un usuario hace clic en un elemento en RecyclerView, quiero actualizar el valor de currentClickedItem en el código anterior. ¿Qué método usaría para hacer esto?

¡Gracias!

Tags:  ,

Answer

  1. Avatar for davy.ai

    Puedes utilizar el método addOnItemTouchListener() para registrar un escuchador de toques para el RecyclerView. Este escuchador interceptará los eventos de toque y te permitirá actualizar el valor de currentClickedItem cuando un usuario haga clic en un elemento. Aquí tienes un ejemplo:

    public class FeedRecyclerView extends RecyclerView {
    
        private int currentClickedItem = -1;
    
        public FeedRecyclerView(@NonNull Context context) {
            super(context);
            init();
        }
    
        public FeedRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs) {
            super(context, attrs);
            init();
        }
    
        public FeedRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            init();
        }
    
        private void init() {
            // Registra un escuchador de toques para el RecyclerView
            addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
                @Override
                public boolean onInterceptTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {
                    // Verifica si el evento es un clic
                    if (e.getAction() == MotionEvent.ACTION_UP) {
                        // Encuentra la posición del elemento clickeado
                        View childView = rv.findChildViewUnder(e.getX(), e.getY());
                        int position = rv.getChildAdapterPosition(childView);
                        // Actualiza el valor de currentClickedItem
                        currentClickedItem = position;
                    }
                    return false;
                }
    
                @Override
                public void onTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {
    
                }
    
                @Override
                public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
    
                }
            });
        }
    }
    

    En este ejemplo, creamos un método privado init() que registra un escuchador de toques para el RecyclerView utilizando addOnItemTouchListener(). El escuchador de toques intercepta los eventos de toque y verifica si el evento es un clic (MotionEvent.ACTION_UP). Si lo es, el código encuentra la posición del elemento clickeado utilizando getChildAdapterPosition() y actualiza el valor de currentClickedItem. Finalmente, el escuchador de toques devuelve false para permitir que otros oyentes de eventos de toque manejen el evento también.

Comments are closed.