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ó.