android - studio - recyclerview seleccionar item
Seleccionar elementos en RecyclerView (3)
Se hizo una pregunta similar, pero no puedo hacer que ninguna funcione.
Lo que quiero es seleccionar un elemento en RecyclerView, cambiar el fondo de esa vista de elemento y almacenar la posición del elemento seleccionado.
El principal problema es que tienes onCreateViewHolder (en adaptador), onBindViewHolder (en adaptador) y ViewHolder constructor y todo el mundo está trabajando con diferentes métodos. Ahora, ni siquiera sé dónde poner en ClickListener (en proyectos anteriores lo puse en ViewHolder), porque las personas también están sugiriendo los otros dos métodos.
Mi idea era almacenar cada ViewHolder (o View) en la lista, para poder hacer referencia a cada fila y cambiar el fondo desde allí. Pero eso no funcionó para mí, porque cuando trato de agregar a la lista de View (o ViewHolders), desde cualquiera de los tres lugares (onCreateVH, onBindVH, VH class), mi aplicación se cuelga por algún motivo (null puntero ex).
¿Alguna sugerencia? ¿Dónde y cómo implementarlo?
Ver tanto la parte 1 como la parte 2. Grandes tutoriales sobre RecyclerView. La Parte 2 explica claramente cómo implementar RecyclerView con el elemento seleccionado, onclick y todas las demás cosas de la vista de lista. El código fuente también se da en github. Espero eso ayude
http://www.bignerdranch.com/blog/recyclerview-part-2-choice-modes/
Antes que nada, preguntaste dónde poner onClickListener, deberías ponerlo en el onBindViewHolder. También puede adjuntar un onClickListener en la clase ViewHolder de su elemento así:
public class ViewHolder extends RecyclerView.ViewHolder {
public ViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
}
}
En cuanto a la implementación de un comportamiento de selección único, las respuestas dadas aquí funcionan, pero invocar onNotifyDatasetChanged es malo para el rendimiento si tiene muchos elementos, ya que vuelve a vincular todas las vistas desde cero cada vez.
El enlace proporcionado por Rafiduzzaman Sonnet es un buen tutorial para comprender muchas cosas sobre la configuración de RecyclerView, pero creo que hace que el comportamiento de selección individual sea complicado. Voy a responder exhaustivamente dando todo lo que pueda necesitar para que funcione. Así es cómo implementé el comportamiento de selección única:
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
final YourItemViewHolder itemViewHolder = (YourItemViewHolder) holder;
//This will remember which one was selected
itemViewHolder.getItemSelectionIndicator()
.setSelected(position == mSelectedPosition);
itemViewHolder.getItemWrapperView()
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(mLogTag, "Tapped on " + position);
//This is the previous selection
notifyItemChanged(mSelectedPosition);
itemViewHolder.getItemSelectionIndicator().setSelected(true);
mSelectedPosition = position;
//This is the new selection
notifyItemChanged(position);
}
});
getItemSelectionIndicator()
y getItemWrapperView()
son métodos dentro del ViewHolder del elemento que devuelven vistas específicas del diseño del elemento. Un ItemWrapperView podría ser el Layout lineal / relativo más alto que envuelve todo el elemento. Establecer un detector de clics en él asegurará que los clics funcionen si el usuario toca en cualquier lugar de la vista del elemento.
ItemSelectionIndicator puede ser Linear o Relative Layout que se ha configurado como un fondo de lista de estado dibujable. Esto significa que cuando se establece como seleccionado, muestra una forma dibujable automáticamente para indicar la selección. Cuando se establece como no seleccionado, el dibujo se eliminará automáticamente. Así es como se ve la vista del indicador:
<RelativeLayout
android:id="@+id/selection_indicator"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/selection_indicator_state_list"/>
Esta es selection_indicator_state_list.xml en res / dibujable:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Selected background -->
<item android:state_selected="true"
android:drawable="@drawable/item_selection_shape"/>
<!-- Unselected background -->
<item android:state_selected="false"
android:drawable="@color/transparent"/>
</selector>
Y esto es item_selection_shape.xml en res / drawable:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
//22 is value of transparency, BDBDBD is the color
<solid android:color="#22BDBDBD"/>
<stroke android:width="2dp" android:color="@color/md_blue_600"/>
<corners
android:radius="3dp"/>
</shape>
Convierta la variable global en posición de almacenamiento y maneje la escucha de clic en ViewHolder
. Onclick
en el elemento, cambie el valor de posición global como
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
globalPosition=getAdapterPosition();
notifyDataSetChanged();
}
});
luego en onBindViewHolder
if(postion==globalPosition)
{
//change color like
textview.setTextColor(Color.RED);
}
else
{
//revert back to regular color
textview.setTextColor(Color.WHITE);
}
con este código, el elemento en el que hizo clic tendrá un color rojo y el resto en blanco.