Cập nhật tháng 10 năm 2016
Phiên bản 25.0.0 của Thư viện hỗ trợ Android được giới thiệu DividerItemDecoration
:
DividerItemDecoration là một RecyclerView.ItemDecor có thể được sử dụng như một bộ chia giữa các mục của a LinearLayoutManager
. Nó hỗ trợ cả hai HORIZONTAL
và VERTICAL
định hướng.
Sử dụng:
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(),
layoutManager.getOrientation());
recyclerView.addItemDecoration(dividerItemDecoration);
Câu trả lời trước
Một số câu trả lời sử dụng các phương pháp đã bị phản đối hoặc không đưa ra giải pháp hoàn chỉnh, vì vậy tôi đã cố gắng thực hiện một bản tóm tắt ngắn gọn, cập nhật.
Không giống như ListView
, RecyclerView
lớp không có tham số liên quan đến bộ chia. Thay vào đó, bạn cần mở rộng ItemDecoration
, RecyclerView
lớp bên trong của:
An ItemDecoration
cho phép ứng dụng thêm bản vẽ và bố cục đặc biệt vào chế độ xem mục cụ thể từ bộ dữ liệu của bộ điều hợp. Điều này có thể hữu ích để vẽ các vạch chia giữa các mục, các điểm nổi bật, ranh giới nhóm trực quan và hơn thế nữa.
Tất cả ItemDecorations
đều được vẽ theo thứ tự chúng được bổ sung, trước khi các quan điểm mục (trong onDraw()
) và sau khi các mục (trong onDrawOver ( Canvas
, RecyclerView
, RecyclerView.State)
.
Vertical
khoảng cách ItemDecoration
Mở rộng ItemDecoration
, thêm hàm tạo tùy chỉnh, lấy không gian height
làm tham số và getItemOffsets()
phương thức ghi đè :
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;
}
}
Nếu bạn không muốn chèn không gian bên dưới mục cuối cùng, hãy thêm điều kiện sau:
if (parent.getChildAdapterPosition(view) != parent.getAdapter().getItemCount() - 1) {
outRect.bottom = verticalSpaceHeight;
}
Lưu ý: bạn cũng có thể sửa đổi outRect.top
, outRect.left
và outRect.right
các thuộc tính cho hiệu quả mong muốn.
Dải phân cách ItemDecoration
Mở rộng ItemDecoration
và ghi đè onDraw()
phương thức:
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);
}
}
}
Bạn có thể gọi hàm tạo đầu tiên sử dụng các thuộc tính bộ chia Android mặc định hoặc hàm thứ hai sử dụng drawable của riêng bạn, ví dụ drawable / spliter.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>
Lưu ý: nếu bạn muốn dải phân cách được vẽ trên các mục của mình, onDrawOver()
thay vào đó hãy ghi đè phương thức.
Sử dụng
Để sử dụng lớp mới của bạn thêm VerticalSpaceItemDecoration
hoặc DividerSpaceItemDecoration
vào RecyclerView
, ví dụ như trong onCreateView()
phương thức của đoạn của bạn :
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;
}
Ngoài ra còn có thư viện của Lucas Rocha được cho là để đơn giản hóa quy trình trang trí vật phẩm. Không thử nó mặc dù.
Trong số các tính năng của nó là:
- Một bộ sưu tập trang trí vật phẩm chứng khoán bao gồm:
- Mục khoảng cách phân chia ngang / dọc.
- Danh sách mục