Saltar al contenido

Cambiar el color de fondo del elemento seleccionado en la vista del reciclador

Guillermo, parte de este equipo, nos ha hecho el favor de escribir esta crónica porque conoce a la perfección este tema.

Solución:

Finalmente, obtuve la respuesta.

public void onBindViewHolder(final ViewHolder holder, final int position) 
        holder.tv1.setText(android_versionnames[position]);

        holder.row_linearlayout.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View view) 
                row_index=position;
                notifyDataSetChanged();
            
        );
        if(row_index==position)
            holder.row_linearlayout.setBackgroundColor(Color.parseColor("#567845"));
            holder.tv1.setTextColor(Color.parseColor("#ffffff"));
        
        else
        
            holder.row_linearlayout.setBackgroundColor(Color.parseColor("#ffffff"));
            holder.tv1.setTextColor(Color.parseColor("#000000"));
        

    

aquí ‘row_index’ se establece como ‘-1’ inicialmente

public class ViewHolder extends RecyclerView.ViewHolder 
        private TextView tv1;
        LinearLayout row_linearlayout;
        RecyclerView rv2;

        public ViewHolder(final View itemView) 
            super(itemView);
            tv1=(TextView)itemView.findViewById(R.id.txtView1);
            row_linearlayout=(LinearLayout)itemView.findViewById(R.id.row_linrLayout);
            rv2=(RecyclerView)itemView.findViewById(R.id.recyclerView1);
        
    

Una forma realmente sencilla de lograr esto sería:

//instance variable
ListitemViewList = new ArrayList<>();

//OnCreateViewHolderMethod
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType)     
    final View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_row, parent, false);
    final MyViewHolder myViewHolder = new MyViewHolder(itemView);

    itemViewList.add(itemView); //to add all the 'list row item' views

    //Set on click listener for each item view
    itemView.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View view) 
            for(View tempItemView : itemViewList) 
                /** navigate through all the itemViews and change color
                of selected view to colorSelected and rest of the views to colorDefault **/
                if(itemViewList.get(myViewHolder.getAdapterPosition()) == tempItemView) 
                    tempItemView.setBackgroundResource(R.color.colorSelected);
                
                else
                    tempItemView.setBackgroundResource(R.color.colorDefault);
                
            
        
    );
    return myViewHolder;

ACTUALIZAR

El método anterior puede arruinar algunos valores predeterminados attributes del itemView, en mi caso, estaba usando CardView, y el radio de la esquina de la tarjeta se eliminaba al hacer clic.

Mejor solucion:

//instance variable
ListcardViewList = new ArrayList<>();

public class MyViewHolder extends RecyclerView.ViewHolder 
        CardView cardView; //THIS IS MY ROOT VIEW
        ...

        public MyViewHolder(View view) 
            super(view);
            cardView = view.findViewById(R.id.row_item_card);
            ...
        


@Override
    public void onBindViewHolder(final MyViewHolder holder, int position) 
        final OurLocationObject locationObject = locationsList.get(position);
        ...

        cardViewList.add(holder.cardView); //add all the cards to this list

        holder.cardView.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View view) 
                //All card color is set to colorDefault
                for(CardView cardView : cardViewList)
                cardView.setCardBackgroundColor(context.getResources().getColor(R.color.colorDefault));
                
                //The selected card is set to colorSelected
                holder.cardView.setCardBackgroundColor(context.getResources().getColor(R.color.colorSelected));
            
        );

ACTUALIZACIÓN 2 – IMPORTANTE

El método onBindViewHolder se llama varias veces, ¡y también cada vez que el usuario desplaza la vista hacia afuera y hacia atrás! Esto hará que la misma vista se agregue a la lista varias veces, lo que puede causar problemas y retrasos menores en la ejecución del código.

Para arreglar esto,cambio

cardViewList.add(holder.cardView);

a

if (!cardViewList.contains(holder.cardView)) 
    cardViewList.add(holder.cardView);

Puedo sugerir esta solución, que utilicé en mi aplicación. He colocado este código de onTouchListener en el constructor de mi clase ViewHolder. itemView es el argumento del constructor. Asegúrate de usar regreso false en este método porque esta necesidad de trabajar OnClickListener

itemView.setOnTouchListener(new View.OnTouchListener() 
    @Override
    public boolean onTouch(View v, MotionEvent event)  event.getAction() == MotionEvent.ACTION_CANCEL)
        
            v.setBackgroundColor(Color.TRANSPARENT);
        
        return false;
    
);

Recuerda algo, que tienes permiso de añadir una evaluación objetiva si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *