android - make - Cómo decorar selectivamente artículos de RecyclerView
recyclerview android studio ejemplo (1)
Estoy creando una subclase de ItemDecoration
partir de esta esencia: https://gist.github.com/alexfu/0f464fc3742f134ccd1e
¿Cómo hacerlo solo decorar artículos con ciertas condiciones? Por ejemplo, solo decora elementos con ciertas posiciones, tipo de ViewHolder, etc.
He modificado la esencia mencionada anteriormente (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, ¿se puede considerar la mejor práctica (con respecto a la separación de preocupaciones) colocar ese tipo de código en la clase ItemDecoration?
También debe llamar a isDecorated en el método de dibujo, ya que en este momento no coloca el desplazamiento en esos elementos, pero aún así lo dibuja.
El método recorre todas las vistas secundarias actualmente en el RecyclerView visible 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);
}
}
}