Estoy tratando de usar a RecyclerView
como horizontal ListView
. Estoy tratando de descubrir cómo resaltar el elemento seleccionado. Cuando hago clic en uno de los elementos, se selecciona y se resalta correctamente, pero cuando hago clic en otro, el segundo se resalta con el anterior.
Aquí está mi función onClick:
@Override
public void onClick(View view) {
if(selectedListItem!=null){
Log.d(TAG, "selectedListItem " + getPosition() + " " + item);
selectedListItem.setBackgroundColor(Color.RED);
}
Log.d(TAG, "onClick " + getPosition() + " " + item);
viewHolderListener.onIndexChanged(getPosition());
selectedPosition = getPosition();
view.setBackgroundColor(Color.CYAN);
selectedListItem = view;
}
Aquí está el onBindViewHolder
:
@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {
viewHolder.setItem(fruitsData[position]);
if(selectedPosition == position)
viewHolder.itemView.setBackgroundColor(Color.CYAN);
else
viewHolder.itemView.setBackgroundColor(Color.RED);
}
android
android-recyclerview
recycler-adapter
usuario65721
fuente
fuente
Respuestas:
Escribí una clase de adaptador base para manejar automáticamente la selección de elementos con un RecyclerView. Simplemente deriva tu adaptador de él y usa listas de estado dibujables con state_selected, como lo harías con una vista de lista.
Tengo una publicación de blog aquí , pero aquí está el código:
fuente
mRecyclerView
No se declara en ninguna parte. ¿Deberíamos pasarlo como un parámetro en el constructor y almacenarlo en un campo?onRecyclerViewAttached
y guárdelo en una variable miembro allí.TrackSelectionAdapter
clase y usarla en mi lista? ¿Cómo "obtengo mi adaptador de tu clase"? Por favor, ¿podrías responder a mi pregunta? Estoy atascado tan profundamente: stackoverflow.com/questions/29695811/…Esta es una forma muy simple de hacerlo.
Tenga un
private int selectedPos = RecyclerView.NO_POSITION;
en la clase RecyclerView Adapter, y en el método onBindViewHolder intente:Y en su evento OnClick modifique:
Funciona de maravilla para el cajón de navegación y otros adaptadores de elementos RecyclerView.
Nota: Asegúrese de usar un color de fondo en su diseño usando un selector como Colabug aclarado:
De lo contrario, setSelected (..) no hará nada, por lo que esta solución será inútil.
fuente
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@color/pressed_color" android:state_pressed="true"/> <item android:drawable="@color/selected_color" android:state_selected="true"/> <item android:drawable="@color/focused_color" android:state_focused="true"/> </selector>
vieHolder.getLayoutPosition
ACTUALIZACIÓN [26 / Jul / 2017]:
Espero que esto ayude.
fuente
Es probable que su implementación funcione si desplaza el contenido fuera de la vista y luego lo vuelve a ver. Estaba teniendo un problema similar cuando me encontré con tu pregunta.
El siguiente fragmento de archivo está funcionando para mí. Mi implementación estaba dirigida a la selección múltiple, pero lancé un truco allí para forzar la selección única. (* 1)
Como se señaló en esta pregunta vinculada , la configuración de los oyentes para viewHolders debe hacerse en onCreateViewHolder. Olvidé mencionar esto anteriormente.
fuente
Creo que he encontrado el mejor tutorial sobre cómo usar RecyclerView con todas las funciones básicas que necesitamos (simple + multiselección, resaltado, ondulación, clic y eliminar en multiselección, etc.).
Aquí está -> http://enoent.fr/blog/2015/01/18/recyclerview-basics/
En base a eso, pude crear una biblioteca "Adaptador flexible", que extiende un Adaptador seleccionable. Creo que esto debe ser responsabilidad del Adaptador, en realidad no es necesario reescribir las funcionalidades básicas del Adaptador cada vez, deje que una biblioteca lo haga, para que pueda reutilizar la misma implementación.
Este adaptador es muy rápido, funciona de fábrica (no es necesario extenderlo); puede personalizar los elementos para cada tipo de vista que necesite; ViewHolder están predefinidos: los eventos comunes ya están implementados: clic simple y largo; mantiene el estado después de la rotación y mucho más .
Eche un vistazo y siéntase libre de implementarlo en sus proyectos.
https://github.com/davideas/FlexibleAdapter
Un Wiki también está disponible.
fuente
Mira mi solución. Supongo que debe establecer la posición seleccionada en el soporte y pasarla como Etiqueta de vista. La vista debe establecerse en el método onCreateViewHolder (...). También hay un lugar correcto para configurar el oyente para la vista, como OnClickListener o LongClickListener.
Mire el siguiente ejemplo y lea los comentarios al código.
fuente
no hay un selector en RecyclerView como ListView y GridView pero intentas a continuación lo que funcionó para mí
crear un selector dibujable como se muestra a continuación
luego establezca este dibujo como fondo de su diseño de fila RecyclerView como
fuente
Decisión con interfaces y devoluciones de llamada. Crear interfaz con estados de selección y anulación de selección:
Implementar interfaz en ViewHolder:
Ejecute el cambio de estado en la devolución de llamada:
Crear RecyclerView con devolución de llamada (ejemplo):
Ver más en el artículo de iPaulPro: https://medium.com/@ipaulpro/drag-and-swipe-with-recyclerview-6a6f0c422efd#.6gh29uaaz
fuente
Esta es mi solución, puede configurar un elemento (o un grupo) y deseleccionarlo con otro clic:
fuente
Tuve el mismo problema y lo soluciono de la siguiente manera:
El archivo xml que se usa para crear una Fila dentro de createViewholder, simplemente agregue la siguiente línea:
O bien, si usa frameLayout como elemento primario del elemento de fila, entonces:
En el código de Java dentro del soporte de la vista donde agregó el escucha de clics:
fuente
No pude encontrar una buena solución en la web para este problema y lo resolví yo mismo. Hay muchas personas que sufren este problema. Por lo tanto, quiero compartir mi solución aquí.
Mientras se desplaza, las filas se reciclan. Por lo tanto, las casillas marcadas y las filas resaltadas no funcionan correctamente. Resolví este problema escribiendo la siguiente clase de adaptador.
También implemento un proyecto completo. En este proyecto, puede seleccionar varias casillas de verificación. Las filas que incluyen casillas seleccionadas están resaltadas. Y lo más importante, estos no se pierden durante el desplazamiento. Puedes descargarlo desde el enlace:
https://www.dropbox.com/s/ssm58w62gw32i29/recyclerView_checkbox_highlight.zip?dl=0
Capturas de pantalla de la aplicación:
fuente
Establezca
private int selected_position = -1;
para evitar que se seleccione cualquier elemento al inicio.fuente
Solo agregar
android:background="?attr/selectableItemBackgroundBorderless"
debería funcionar si no tiene color de fondo, pero no olvide usar el método setSelected. Si tiene un color de fondo diferente, acabo de usar esto (estoy usando enlace de datos);Establecer isSelected en la función onClick
Y agregue esto a xml;
fuente
Hacer selector:
Establecer como fondo en el diseño de elementos de la lista
En su adaptador, agregue OnClickListener a la vista (método onBind)
En el evento onClick, active la vista:
fuente