Mise à jour d'octobre 2016
La version 25.0.0 d'Android Support Library a introduit la DividerItemDecoration
classe:
DividerItemDecoration est un RecyclerView.ItemDecoration qui peut être utilisé comme séparateur entre les éléments d'un LinearLayoutManager
. Il soutient à la fois HORIZONTAL
et les VERTICAL
orientations.
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 RecyclerView
classe n'a pas de paramètres liés au diviseur. , Vous avez besoin au lieu d'étendre ItemDecoration
, une RecyclerView
classe interne de »:
An ItemDecoration
permet à 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 ItemDecorations
sont 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 height
comme 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.left
et outRect.right
propriétés pour effet désiré.
Séparateur ItemDecoration
Étendre ItemDecoration
et 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 VerticalSpaceItemDecoration
ou 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