Pembaruan Oktober 2016
Versi 25.0.0 dari Perpustakaan Dukungan Android memperkenalkan DividerItemDecoration
kelas:
DividerItemDecoration adalah RecyclerView.ItemDecoration yang dapat digunakan sebagai pembagi antara item a LinearLayoutManager
. Ini mendukung keduanya HORIZONTAL
dan VERTICAL
orientasi.
Pemakaian:
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(),
layoutManager.getOrientation());
recyclerView.addItemDecoration(dividerItemDecoration);
Jawaban sebelumnya
Beberapa jawaban baik menggunakan metode yang sudah usang, atau tidak memberikan solusi lengkap, jadi saya mencoba untuk melakukan singkat, up-to-date.
Tidak seperti ListView
, RecyclerView
kelas tidak memiliki parameter terkait pembagi. Sebaliknya, Anda perlu memperluas ItemDecoration
, RecyclerView
kelas batin seorang:
An ItemDecoration
memungkinkan aplikasi untuk menambahkan offset gambar dan tata letak khusus ke tampilan item tertentu dari kumpulan data adaptor. Ini dapat berguna untuk menggambar pembagi antara item, sorotan, batas pengelompokan visual, dan lainnya.
Semua ItemDecorations
diambil dalam urutan mereka ditambahkan, sebelum pandangan item (dalam onDraw()
) dan setelah semuanya (di onDrawOver ( Canvas
, RecyclerView
, RecyclerView.State)
.
Vertical
jarak ItemDecoration
Perpanjang ItemDecoration
, tambahkan konstruktor khusus yang menggunakan spasi height
sebagai parameter dan getItemOffsets()
metode override :
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;
}
}
Jika Anda tidak ingin memasukkan ruang di bawah item terakhir, tambahkan kondisi berikut:
if (parent.getChildAdapterPosition(view) != parent.getAdapter().getItemCount() - 1) {
outRect.bottom = verticalSpaceHeight;
}
Catatan: Anda juga dapat memodifikasi outRect.top
, outRect.left
dan outRect.right
properti untuk efek yang diinginkan.
Pembagi ItemDecoration
Perluas ItemDecoration
dan timpa onDraw()
metode:
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);
}
}
}
Anda dapat memanggil konstruktor pertama yang menggunakan atribut pembagi Android default, atau yang kedua yang menggunakan drawable Anda sendiri, misalnya 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>
Catatan: jika Anda ingin pembagi digambar di atas item Anda, onDrawOver()
ganti metode.
Pemakaian
Untuk menggunakan kelas baru Anda tambahkan VerticalSpaceItemDecoration
atau DividerSpaceItemDecoration
ke RecyclerView
, misalnya dalam onCreateView()
metode fragmen Anda :
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;
}
Ada juga perpustakaan Lucas Rocha yang seharusnya menyederhanakan proses dekorasi item. Belum mencobanya.
Di antara fitur - fiturnya adalah:
- Koleksi dekorasi stok barang termasuk:
- Item spacing Pembagi horizontal / vertikal.
- Daftar barang