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.

La función de ampliar y contraer para RecyclerView de Android no está funcionando como se esperaba.

Estoy desarrollando una aplicación con un RecyclerView expandible. Sin embargo, la expansión no está funcionando como se esperaba. Nada funciona si hago clic en cualquier elemento que esté en estado colapsado después de expandir otro elemento. Quiero que el elemento previamente expandido se colapse automáticamente si hago clic en cualquier otro elemento.

Por favor, vea mi código para lo mismo:

final boolean isExpanded = position == mExpandedPosition;
holder.expandableLayout.setVisibility(isExpanded ? View.VISIBLE : View.GONE);
holder.itemView.setActivated(isExpanded);
if (isExpanded) {
    previousExpandedPosition = position;
}
holder.itemView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        mExpandedPosition = isExpanded ? -1 : position;
        notifyItemChanged(previousExpandedPosition);
        notifyItemChanged(position);
    }
});

Por favor, corríjame si hay algo mal en mi implementación.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Basándose en el código proporcionado, parece que el problema es que el elemento anterior no se colapsa automáticamente cuando se expande otro elemento.

    Para lograr esto, puedes llevar un registro de la posición previamente expandida y colapsarla cuando se expande un nuevo elemento. Aquí tienes un fragmento de código actualizado que debería funcionar:

    final boolean isExpanded = position == mExpandedPosition;
    holder.expandableLayout.setVisibility(isExpanded ? View.VISIBLE : View.GONE);
    holder.itemView.setActivated(isExpanded);
    
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mExpandedPosition != -1) {
                // Colapsar el elemento previamente expandido
                notifyItemChanged(mExpandedPosition);
            }
    
            // Expandir/colapsar el elemento seleccionado
            mExpandedPosition = isExpanded ? -1 : position;
            notifyItemChanged(position);
        }
    });
    

    En este código, primero verificamos si hay una posición previamente expandida (mExpandedPosition != -1). Si la hay, notificamos al adaptador que el elemento en esa posición debería colapsarse (notifyItemChanged(mExpandedPosition)).

    Luego, actualizamos la posición expandida a la posición clicada (mExpandedPosition = isExpanded ? -1 : position) y notificamos al adaptador que actualice tanto la posición previamente expandida (si la había) como la posición clicada (notifyItemChanged(position)).

    Con estos cambios, tu RecyclerView expandible debería colapsar automáticamente el elemento previamente expandido cuando se hace clic en un nuevo elemento.

Comments are closed.