Actualización de octubre de 2016
La versión 25.0.0 de Android Support Library introdujo la DividerItemDecorationclase:
DividerItemDecoration es un RecyclerView.ItemDecoration que se puede usar como un divisor entre los elementos de a LinearLayoutManager. Es compatible con ambos HORIZONTALy VERTICALorientaciones.
Uso:
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(),
layoutManager.getOrientation());
recyclerView.addItemDecoration(dividerItemDecoration);
Respuesta anterior
Algunas respuestas usan métodos que han quedado obsoletos, o no dan una solución completa, por lo que intenté hacer un resumen breve y actualizado.
A diferencia ListView, la RecyclerViewclase no tiene parámetros relacionados con el divisor. En cambio, necesita extender ItemDecoration, RecyclerViewla clase interna de a:
Un ItemDecorationpermite que la aplicación agregue un desplazamiento especial de dibujo y diseño a vistas de elementos específicos del conjunto de datos del adaptador. Esto puede ser útil para dibujar divisores entre elementos, resaltados, límites de agrupación visual y más.
Todo ItemDecorationsse dibujan en el orden en que se agregaron, antes de que las vistas de elementos (en onDraw()) y después de los artículos (en onDrawOver ( Canvas, RecyclerView, RecyclerView.State).
Vertical espaciado ItemDecoration
Extienda ItemDecoration, agregue un constructor personalizado que tome espacio heightcomo parámetro y getItemOffsets()método de anulación :
public class VerticalSpaceItemDecoration extends RecyclerView.ItemDecoration {
private final int verticalSpaceHeight;
public VerticalSpaceItemDecoration(int verticalSpaceHeight) {
this.verticalSpaceHeight = verticalSpaceHeight;
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
RecyclerView.State state) {
outRect.bottom = verticalSpaceHeight;
}
}
Si no desea insertar espacio debajo del último elemento, agregue la siguiente condición:
if (parent.getChildAdapterPosition(view) != parent.getAdapter().getItemCount() - 1) {
outRect.bottom = verticalSpaceHeight;
}
Nota: también se puede modificar outRect.top, outRect.lefty outRect.rightpropiedades para el efecto deseado.
Divisor ItemDecoration
Método de extensión ItemDecorationy anulación onDraw():
public class DividerItemDecoration extends RecyclerView.ItemDecoration {
private static final int[] ATTRS = new int[]{android.R.attr.listDivider};
private Drawable divider;
/**
* Default divider will be used
*/
public DividerItemDecoration(Context context) {
final TypedArray styledAttributes = context.obtainStyledAttributes(ATTRS);
divider = styledAttributes.getDrawable(0);
styledAttributes.recycle();
}
/**
* Custom divider will be used
*/
public DividerItemDecoration(Context context, int resId) {
divider = ContextCompat.getDrawable(context, resId);
}
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
int left = parent.getPaddingLeft();
int right = parent.getWidth() - parent.getPaddingRight();
int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
View child = parent.getChildAt(i);
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
int top = child.getBottom() + params.bottomMargin;
int bottom = top + divider.getIntrinsicHeight();
divider.setBounds(left, top, right, bottom);
divider.draw(c);
}
}
}
Puede llamar al primer constructor que usa los atributos de divisor de Android predeterminados, o al segundo que usa su propio dibujable, por ejemplo drawable / divider.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<size android:height="1dp" />
<solid android:color="#ff992900" />
</shape>
Nota: si desea que el divisor se dibuje sobre sus elementos, anule el onDrawOver()método en su lugar.
Uso
Para usar su nueva clase add VerticalSpaceItemDecorationo DividerSpaceItemDecorationto RecyclerView, por ejemplo en el onCreateView()método de su fragmento :
private static final int VERTICAL_ITEM_SPACE = 48;
private RecyclerView recyclerView;
private LinearLayoutManager linearLayoutManager;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_feed, container, false);
recyclerView = (RecyclerView) rootView.findViewById(R.id.fragment_home_recycler_view);
linearLayoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(linearLayoutManager);
//add ItemDecoration
recyclerView.addItemDecoration(new VerticalSpaceItemDecoration(VERTICAL_ITEM_SPACE));
//or
recyclerView.addItemDecoration(new DividerItemDecoration(getActivity()));
//or
recyclerView.addItemDecoration(
new DividerItemDecoration(getActivity(), R.drawable.divider));
recyclerView.setAdapter(...);
return rootView;
}
También está la biblioteca de Lucas Rocha, que se supone que simplifica el proceso de decoración del artículo. Aunque no lo he intentado.
Entre sus características están:
- Una colección de decoraciones de artículos en stock que incluyen:
- Separación entre elementos Divisores horizontales / verticales.
- Elemento de la lista