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.

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?

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.

  • ¿Cómo configurar la altura de recyclerview de forma programática?
  • Cómo obtener la altura del elemento recyclerview en "onBindViewHolder"
  • Anular la animación para notifyItemChanged en RecyclerView.Adapter
  • RecyclerVista la lista con los artículos con los límites en un ángulo, no horizontal
  • ¿Cómo puede RecyclerView ItemTouchHelper bloqueo deslizar artículo?
  • ¿Por qué no overScrollBy () y onOverScrolled () funcionan con RecyclerView
  • RecyclerView LayoutManager findViewByPosition devuelve null
  • Android - Cómo detener la recarga de imágenes en Recyclerview al desplazarse
  • LinearLayoutManager setOrientation después de rotación del teléfono no funciona
  • Recyclerview notifyDataSetChanged (); no funciona
  • No hay animación en la eliminación de artículos en RecyclerView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.