Mise à jour d'octobre 2016
La version 25.0.0 d'Android Support Library a introduit la DividerItemDecorationclasse:
DividerItemDecoration est un RecyclerView.ItemDecoration qui peut être utilisé comme séparateur entre les éléments d'un LinearLayoutManager. Il soutient à la fois HORIZONTALet les VERTICALorientations.
Usage:
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(),
layoutManager.getOrientation());
recyclerView.addItemDecoration(dividerItemDecoration);
Réponse précédente
Certaines réponses utilisent des méthodes qui sont devenues obsolètes depuis, ou ne donnent pas de solution complète, j'ai donc essayé de faire un bref résumé à jour.
Contrairement à ListView, la RecyclerViewclasse n'a pas de paramètres liés au diviseur. , Vous avez besoin au lieu d'étendre ItemDecoration, une RecyclerViewclasse interne de »:
An ItemDecorationpermet à l'application d'ajouter un dessin spécial et un décalage de mise en page à des vues d'élément spécifiques de l'ensemble de données de l'adaptateur. Cela peut être utile pour dessiner des séparations entre les éléments, les reflets, les limites de regroupement visuel et plus encore.
Tous ItemDecorationssont attirés dans l'ordre où ils ont été ajoutés, avant que les vues de l' objet (dans onDraw()) et après les articles (en onDrawOver ( Canvas, RecyclerView, RecyclerView.State).
Vertical espacement ItemDecoration
Étendez ItemDecoration, ajoutez un constructeur personnalisé qui prend de l'espace heightcomme paramètre et remplacez la getItemOffsets()méthode:
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 vous ne souhaitez pas insérer d'espace sous le dernier élément, ajoutez la condition suivante:
if (parent.getChildAdapterPosition(view) != parent.getAdapter().getItemCount() - 1) {
outRect.bottom = verticalSpaceHeight;
}
Remarque: vous pouvez également modifier outRect.top, outRect.leftet outRect.rightpropriétés pour effet désiré.
Séparateur ItemDecoration
Étendre ItemDecorationet remplacer la onDraw()méthode:
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);
}
}
}
Vous pouvez soit appeler le premier constructeur qui utilise les attributs du diviseur Android par défaut, ou le second qui utilise votre propre dessinable, par exemple 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>
Remarque: si vous souhaitez que le séparateur soit tracé sur vos éléments, remplacez onDrawOver()plutôt la méthode.
Usage
Pour utiliser votre nouvelle classe, ajoutez VerticalSpaceItemDecorationou DividerSpaceItemDecorationà RecyclerView, par exemple dans la onCreateView()méthode de votre fragment :
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;
}
Il y a aussi la bibliothèque de Lucas Rocha qui est censée simplifier le processus de décoration des objets. Je n'ai pas encore essayé.
Parmi ses caractéristiques :
- Une collection de décorations d'articles en stock comprenant:
- Espacement des articles Diviseurs horizontaux / verticaux.
- Élément de liste