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.

setOnClickListener RecycleView (en un Fragmento) navegar hacia otro Fragmento

Tengo un RecycleView en Fragment. Cuando pulso uno de los elementos del RecyclerView, quiero abrir un nuevo Fragment. El segundo Fragment no reemplaza al anterior, sino que se sobrescribe el Fragment actual. Imagen. ¿Cómo puedo solucionar esto?

Mi adaptador:

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        // Obtén el elemento de tu conjunto de datos en esta posición y reemplaza el
        // contenido de la vista con ese elemento

        val currentProduct = productList[position]

        holder.image.setImageBitmap(currentProduct.image)
        holder.title.text = currentProduct.title
        holder.price.text = currentProduct.price.toString() + "€"

        // Ir a los detalles del producto
        holder.itemView.setOnClickListener {
            val activity = it.context as AppCompatActivity
            val detailsFragment = ProductDetailsFragment()
            activity.supportFragmentManager.beginTransaction().replace(R.id.fragment, detailsFragment).addToBackStack(null).commit()
        }
    }
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para solucionar este problema, en lugar de usar el método replace en la Activity, podemos crear una nueva instancia de FragmentManager en el adaptador de RecyclerView y usarlo para abrir el nuevo Fragment.

    Aquí está la versión actualizada del adaptador:

        override fun onBindViewHolder(holder: ViewHolder, position: Int) {
            val currentProduct = productList[position]
    
            holder.image.setImageBitmap(currentProduct.image)
            holder.title.text = currentProduct.title
            holder.price.text = currentProduct.price.toString()+ "€"
    
            //Ir a los detalles del producto
            holder.itemView.setOnClickListener {
                val detailsFragment = ProductDetailsFragment()
                val fragmentManager = (holder.itemView.context as AppCompatActivity).supportFragmentManager
                fragmentManager.beginTransaction()
                    .replace(R.id.fragment_container, detailsFragment)
                    .addToBackStack(null)
                    .commit()
            }
        }
    

    En este adaptador actualizado, obtenemos el FragmentManager del contexto actual del elemento de RecyclerView, en lugar de usar la Activity. También hemos utilizado un ID de contenedor diferente (R.id.fragment_container) para el contenedor del Fragment, ya que probablemente será diferente del ID de contenedor original en el primer Fragment.

    Esto asegurará que el segundo Fragment se añada correctamente a la pila de retroceso (Backstack) y no sobrescribirá el Fragment anterior.

Comments are closed.