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:
- Selector de botones de Android
- Marcar al usuario seleccionado como se ha activado en FriendPicker (Facebook SDK para Android)
- ListView Sombra de artículo + selector personalizado
- Android linearlayout selector de fondo
- Cómo cambiar el color del texto en la prensa de un textview particular en un linearlayout
<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 …
- Android Selector Drawable no funciona con atributos
- Appcompact DialogFragment de una sola opción marca de verificación color
- Deshabilitar el resaltado de GridView de Android completamente (deshabilitar la selección)
- Selección de un número del usuario con varios números cuando se utiliza el selector de contactos
- El selector ImageView no funciona
- Android: ¿por qué no puedo usar un selector para el fondo de TextView?
- Pulgar personalizado para un buscador en Android
- ¿Cómo cambiar el color presionado a otro color del selector dinámicamente?
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