Cómo agregar consistentemente fondos alternativos a las vistas de elementos en RecyclerView
Hasta ahora he utilizado el adaptador onBindViewHolder
para establecer un fondo alternativo basado en la Posición del adaptador del elemento.
@Override public void onBindViewHolder(ViewHolder holder, int position) { holder.itemView.setBackgroundResource(position % 2 == 0 ? R.color.list_item_background_alternating : R.color.list_item_background); ... }
Sin embargo, esto es cada vez más complicado cuando se hace algo más que mostrar una lista. Por ejemplo: Cuando notifyItemRemoved(index);
un elemento y llamo a notifyItemRemoved(index);
El RecyclerView
hace una animación agradable y la vista del artículo se ha ido. Sin embargo, la vista que sustituye a la eliminada no se vuelve a ligar (por razones obvias y buenas) y por lo tanto mantiene su fondo antiguo. Esto conduce a inconsistencias con el diseño y se ve feo. Cuando llamo a notifyDataSetChanged();
Los fondos son todos correctos, pero pierdo la animación.
- RecyclerView muestra los datos eliminados en la lista
- ¿Cómo mostrar diferentes diseños en recyclerView?
- Android - ¿Cómo cambiar la altura de Recyclerview dinámicamente?
- Recyclerview dentro de la vista de desplazamiento anidada cargando todos los datos en lugar de llamar una por una imagen cuando se desplaza
- ¿Cómo puedo hacer que RecyclerView actualice su diseño?
Tengo un problema similar cuando estoy usando SortedList
(con un SortedListAdapterCallback
). Dado que la clasificación parece tener lugar después de que las vistas están limitadas, los fondos están en ruinas.
¿Cuál sería una manera apropiada / consistente de implementar tal comportamiento?
- ¿Cómo obtener la vista de niño de RecyclerView?
- RecyclerView gravedad
- Android: Sugerencia necesaria para actualizar la vista del reciclador en el elemento seleccionado de la ruleta
- RecyclerVer elementoClickListener en Kotlin
- NotifyDataSetChanged no actualiza RecyclerView
- Android recyclerView findViewHolderForAdapterPosition devuelve null
- ¿Cómo cambiar el color del elemento Recycler?
- Encabezado RecyclerView bajo elementos de Android
Muy bien, mientras estaba escribiendo mi pregunta que quería probar una cosa que pensé que no funcionaría – sin embargo, lo hizo.
ItemDecoration
un ItemDecoration
y lo getItemOffset();
es getItemOffset();
Para establecer el fondo de la vista:
public class BackgroundItemDecoration extends RecyclerView.ItemDecoration { private final int mOddBackground; private final int mEvenBackground; public BackgroundItemDecoration(@DrawableRes int oddBackground, @DrawableRes int evenBackground) { mOddBackground = oddBackground; mEvenBackground = evenBackground; } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { super.getItemOffsets(outRect, view, parent, state); int position = parent.getChildAdapterPosition(view); view.setBackgroundResource(position % 2 == 0 ? mEvenBackground : mOddBackground); } }
Me siento un poco culpable, sin embargo, que estoy piggy-embolsado en getItemOffsets()
.
¿Alguien tiene una solución más limpia / mejor?
Esta es mi solución El itemView se refiere a la vista desde el inflador de diseño en el onCreateViewHolder.
public void onBindViewHolder(MyViewHolder holder, int position){ //alternate row color if(position % 2==0) holder.itemView.setBackgroundColor(Color.YELLOW); else holder.itemView.setBackgroundColor(Color.LTGRAY); )
Eso es todo lo que necesitas. Espero que esto ayude.
- Fab.show () no animado por primera vez después de inicializar nueva actividad
- EXCEPCIÓN INESPERADA DE SUPERIOR NIVEL: com.android.dex.DexException