Ekim 2016 Güncellemesi
Android Destek Kitaplığı'nın 25.0.0 sürümü DividerItemDecoration
sınıfı tanıttı :
DividerItemDecoration, a öğelerinin arasında bölücü olarak kullanılabilen bir RecyclerView.ItemDecoration öğesidir LinearLayoutManager
. Hem destekler HORIZONTAL
ve VERTICAL
yönelimleri.
Kullanımı:
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(),
layoutManager.getOrientation());
recyclerView.addItemDecoration(dividerItemDecoration);
Önceki cevap
Bazı cevaplar ya o zamandan beri kullanımdan kaldırılmış yöntemleri kullanın, ya da tam bir çözüm vermeyin, bu yüzden kısa, güncel bir sargı yapmaya çalıştım.
Sınıfın aksine ListView
, RecyclerView
bölücüyle ilgili parametre yoktur. Bunun yerine, ItemDecoration
bir RecyclerView
iç sınıfı genişletmeniz gerekir :
A ItemDecoration
, uygulamanın, bağdaştırıcının veri kümesinden belirli öğe görünümlerine özel bir çizim ve düzen ofseti eklemesine izin verir. Bu, öğeler, vurgular, görsel gruplama sınırları ve daha fazlası arasında ayırıcılar çizmek için yararlı olabilir.
Hepsi ItemDecorations
(öğe görünümleri önce, eklendikleri sırayla çizilir onDraw()
() ve öğeleri sonra onDrawOver (içinde Canvas
, RecyclerView
, RecyclerView.State)
.
Vertical
aralık ItemDecoration
Genişletin ItemDecoration
, height
parametre olarak yer kaplayan özel yapıcı ekleyin ve getItemOffsets()
yöntemi geçersiz kılı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;
}
}
Son öğenin altına boşluk eklemek istemiyorsanız, aşağıdaki koşulu ekleyin:
if (parent.getChildAdapterPosition(view) != parent.getAdapter().getItemCount() - 1) {
outRect.bottom = verticalSpaceHeight;
}
Not: Ayrıca değiştirebilir outRect.top
, outRect.left
ve outRect.right
istenilen etki için özellikleri.
bölen ItemDecoration
Genişletme ItemDecoration
ve geçersiz kılma onDraw()
yöntemi:
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);
}
}
}
Varsayılan Android bölücü niteliklerini kullanan ilk yapıcıyı veya kendi çekilebilirinizi kullanan ikinci yapıcıyı çağırabilirsiniz, örneğin 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>
Not: bölücünün öğelerinizin üzerine çizilmesini istiyorsanız, onDrawOver()
bunun yerine yöntemi geçersiz kılın .
kullanım
Yeni sınıf eklenti kullanmak için VerticalSpaceItemDecoration
ya DividerSpaceItemDecoration
hiç RecyclerView
senin veridiliminin örneğin, onCreateView()
yöntemin:
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;
}
Ayrıca eşya dekorasyon sürecini basitleştirmesi gereken Lucas Rocha'nın kütüphanesi de var. Yine de denemedim.
Onun arasında özellikleri şunlardır:
- Aşağıdakiler de dahil olmak üzere stok öğesi süslemelerinden oluşan bir koleksiyon:
- Öğe aralığı Yatay / dikey bölücüler.
- Liste öğesi