Cómo decorar selectivamente los elementos de RecyclerView

Estoy creando una subclase de ItemDecoration de esta esencia: https://gist.github.com/alexfu/0f464fc3742f134ccd1e

¿Cómo hacer que sólo decorar los artículos con ciertas condiciones? Por ejemplo, sólo decorar elementos con ciertas posiciones, tipo de ViewHolder, etc.

He modificado el gist mencionado arriba (más algunos cambios en la API de Android obsoleta) con este código, pero todos los artículos se decoran de todos modos:

 public boolean isDecorated(View view, RecyclerView parent) { RecyclerView.ViewHolder holder = parent.getChildViewHolder(view); return holder instanceof MenuIconViewHolder || holder instanceof MenuDetailViewHolder; } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { if (isDecorated(view, parent)) { if (mOrientation == VERTICAL_LIST) { outRect.set(0, 0, 0, mDivider.getIntrinsicHeight()); } else { outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0); } } else { super.getItemOffsets(outRect, view, parent, state); } } 

¿Qué pasa con el código anterior? Por cierto, ¿puede considerarse la mejor práctica (en cuanto a la separación de las preocupaciones) para colocar ese tipo de código en la clase ItemDecoration?

Tienes que llamar a isDecorated en el método de dibujo, así, porque en el momento en que no se pone la compensación en esos elementos, pero todavía dibujar sobre ella.

El método loops sobre todas las vistas secundarias actualmente en el RecyclerView visibles en la pantalla.

 public void drawVertical(Canvas c, RecyclerView parent) { final int left = parent.getPaddingLeft(); final int right = parent.getWidth() - parent.getPaddingRight(); final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); if(isDecorated(child, parent)) { final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); final int top = child.getBottom() + params.bottomMargin; final int bottom = top + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } } public void drawHorizontal(Canvas c, RecyclerView parent) { final int top = parent.getPaddingTop(); final int bottom = parent.getHeight() - parent.getPaddingBottom(); final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); if(isDecorated(child, parent)) { final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); final int left = child.getRight() + params.rightMargin; final int right = left + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } } 
  • Cómo implementar ItemAnimator de RecyclerView para deshabilitar la animación de notifyItemChanged
  • Problemas con la implementación del modo de acción contextual en fragmento recyclerview
  • RecyclerView expandible cardView
  • Facebook Anuncios nativos en RycyclerView android
  • SwipeRefreshLayout está oculto en vacío RecyclerView
  • RecyclerView dentro de ScrollView no funciona
  • RecyclerView - animar el cambio de las columnas del gestor de diseño de cuadrícula
  • La vista horizontal del reciclador no muestra nada
  • PopupMenu no se encuentra correctamente dentro de RecyclerView
  • ¿Cómo se puede agregar una línea de divisor en un Android RecyclerView?
  • Elemento de Recyclerview efecto de ondulación de clic
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.