Selector de fondo en RecyclerView Item

Estoy usando el RecyclerView como a continuación:

 <android.support.v7.widget.RecyclerView android:id="@+id/list" android:layout_width="320dp" android:layout_height="match_parent"/> 

Y mi artículo de lista:

 <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/selector_medium_high"> <com.basf.suvinil.crie.ui.common.widget.CircleView android:id="@+id/circle" android:layout_width="22dp" android:layout_height="22dp"/> <TextView android:id="@+id/label" android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="57.5dp"/> </LinearLayout> 

Ver en detalle esta parte android:background="@drawable/selector_medium_high" es un selector normal:

 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@color/background_high" android:state_activated="true"/> <item android:drawable="@color/background_high" android:state_pressed="true"/> <item android:drawable="@color/background_high" android:state_checked="true"/> <item android:drawable="@color/background_high" android:state_focused="true"/> <item android:drawable="@color/background_medium"/> </selector> 

Pero cuando ejecuto este código, no tengo cambios en el color de fondo cuando toco la fila …

Establecer en clickable , focusable , focusableInTouchMode a true en todos los elementos de RecyclerView "list".

Añadir:

 android:background="?android:attr/selectableItemBackground" 

En item.xml

La adición de android:background="?android:attr/selectableItemBackground" my_list_item.xml android:background="?android:attr/selectableItemBackground" al my_list_item.xml de raíz de my_list_item.xml parece funcionar para mí (suponiendo que desea el color de selección por defecto).

También asegúrate de que el layout de la raíz android:layout_width sea match_parent lugar de wrap_content para asegurar que toda la fila sea seleccionable.

Desafortunadamente usar vistas focusable para simular la selección del artículo no es una buena solución porque:

  • El enfoque se pierde cuando se llama notifyDataSetChanged
  • El enfoque es problemático cuando las vistas de los niños se pueden enfocar

Escribí una clase del adaptador de la base para manejar automáticamente la selección del artículo con un RecyclerView. Basta con extraer su adaptador de él y usar listas de estado con state_selected, como lo haría con una vista de lista.

Tengo un post de blog Aquí sobre esto, pero aquí está el código:

 public abstract class TrackSelectionAdapter<VH extends TrackSelectionAdapter.ViewHolder> extends RecyclerView.Adapter<VH> { // Start with first item selected private int focusedItem = 0; @Override public void onAttachedToRecyclerView(final RecyclerView recyclerView) { super.onAttachedToRecyclerView(recyclerView); // Handle key up and key down and attempt to move selection recyclerView.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { RecyclerView.LayoutManager lm = recyclerView.getLayoutManager(); // Return false if scrolled to the bounds and allow focus to move off the list if (event.getAction() == KeyEvent.ACTION_DOWN) { if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) { return tryMoveSelection(lm, 1); } else if (keyCode == KeyEvent.KEYCODE_DPAD_UP) { return tryMoveSelection(lm, -1); } } return false; } }); } private boolean tryMoveSelection(RecyclerView.LayoutManager lm, int direction) { int tryFocusItem = focusedItem + direction; // If still within valid bounds, move the selection, notify to redraw, and scroll if (tryFocusItem >= 0 && tryFocusItem < getItemCount()) { notifyItemChanged(focusedItem); focusedItem = tryFocusItem; notifyItemChanged(focusedItem); lm.scrollToPosition(focusedItem); return true; } return false; } @Override public void onBindViewHolder(VH viewHolder, int i) { // Set selected state; use a state list drawable to style the view viewHolder.itemView.setSelected(focusedItem == i); } public class ViewHolder extends RecyclerView.ViewHolder { public ViewHolder(View itemView) { super(itemView); // Handle item click and set the selection itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Redraw the old selection and the new notifyItemChanged(focusedItem); focusedItem = mRecyclerView.getChildPosition(v); notifyItemChanged(focusedItem); } }); } } } 

Si nada de esto funciona para usted, al igual que no para mí, utilice este código:

 android:foreground="?android:attr/selectableItemBackground" 

El truco está en android:foreground atributo de android:foreground

  viewHolder.mRlPrince.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction()==MotionEvent.ACTION_DOWN){ viewHolder.mRlPrince.setBackgroundColor(Color.parseColor("#f8f8f8")); }if (event.getAction()==MotionEvent.ACTION_UP){ viewHolder.mRlPrince.setBackgroundColor(Color.WHITE); } return false; } }); 

Agregue este atributo debajo en su elemento "my_list_item.xml"
android:descendantFocusability="blocksDescendants" Esto funciona para mí!

Necesitas establecer android:clickable="true" en el elemento xml, y si tienes más selectores en alguna vista dentro de tu vista, debes configurar android:duplicateParentState="true" allí también. Eso funciona en apis de panal pre.

Como muchos otros respondieron la única manera es combinar selectores y nuevas clases para seguir la pista de la selección, pero mejor delegar este cálculo al adaptador. La biblioteca FlexibleAdapter realiza un seguimiento de las selecciones para usted, el cambio de configuración también es compatible.

Los colores de fondo con ondulación ahora se pueden hacer sin parte XML, pero en el código para administrar datos dinámicos.

Por último, puede utilizar muchas características con la misma biblioteca, la selección es una pequeña característica básica que puede tener.

Por favor, eche un vistazo a la descripción, las páginas Wiki y el ejemplo completo de trabajo: https://github.com/davideas/FlexibleAdapter

  • Android: Cómo hacer un selector desplegable
  • Archivo XML válido da un error "no se pudo analizar" en Android ADT
  • Android ImageButton estado no cambia
  • Definición dinámica y uso de selectores
  • Android drawable invalid start tag
  • Android - barra de búsqueda de estilo
  • NullPointerException en el método de mutación de Drawable Android 1.6
  • Cómo establecer el color de fila alternativo de Listview y el color de fondo del elemento seleccionado
  • Cambio de relleno en el selector
  • Selector hereda
  • Cómo cambiar textColor de un botón de XML en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.