RecyclerView呼叫addItemDecoration新增自定義分割線
阿新 • • 發佈:2019-01-10
最近在做專案中使用RecyclerView的addItemDecoration方法新增分割線,出現了分割線在有些手機(比如魅藍和小米手機)顯示不出來的問題。
後來在網上找了一些資料,還是無法修改分割線顏色,最後找到了正確的方法,實現了修改分割線顏色和高度。
自定義RecyclerView.ItemDecoration類的子類SimpleDividerItemDecoration類,程式碼如下:
public class SimpleDividerItemDecoration extends RecyclerView.ItemDecoration { private Drawable mDivider; public SimpleDividerItemDecoration(Context context) { mDivider = context.getResources().getDrawable(R.drawable.line_divider); } @Override public void onDrawOver(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 + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } }
說明:context.getResources().getDrawable(R.drawable.line_divider);
line_divider.xml:
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <size android:width="1dp" android:height="1dp" /> <solid android:color="@color/dark_gray" /> </shape>
說明:通過修改android:color和android:height可以修改分割線顏色和寬度。
最後,RecyclerView物件使用addItemDecoration方法新增分割線,程式碼如下:recyclerView.addItemDecoration(new SimpleDividerItemDecoration(this));
原文地址:http://stackoverflow.com/questions/31242812/how-can-a-divider-line-be-added-in-an-android-recyclerview
上面方式定義的公共類SimpleDividerItemDecoration類可以被許多頁面的RecyclerView共用,分割線的寬度和顏色統一,缺點是無法實現不同頁面使用不同顏色和高度的分割線。
以下對SimpleDividerItemDecoration進行了修正,實現了自定義顏色和高度的分割線效果。
public class SimpleDividerItemDecoration extends RecyclerView.ItemDecoration {
private Drawable mDivider; //分割線Drawable
private int mDividerHeight; //分割線高度
/**
* 使用line_divider中定義好的顏色
* @param context
* @param dividerHeight 分割線高度
*/
public SimpleDividerItemDecoration(Context context, int dividerHeight) {
mDivider = ContextCompat.getDrawable(context, R.drawable.line_divider);
mDividerHeight = dividerHeight;
}
/**
*
* @param context
* @param divider 分割線Drawable
* @param dividerHeight 分割線高度
*/
public SimpleDividerItemDecoration(Context context, Drawable divider, int dividerHeight){
if(divider == null){
mDivider = ContextCompat.getDrawable(context, R.drawable.line_divider);
}else{
mDivider = divider;
}
mDividerHeight = dividerHeight;
}
//獲取分割線尺寸
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
outRect.set(0, 0, 0, mDividerHeight);
}
@Override
public void onDrawOver(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 + mDividerHeight;
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}
使用方法:
Drawable drawable = ContextCompat.getDrawable(getActivity(), R.drawable.line_divider_red);
recyclerView.addItemDecoration(new SimpleDividerItemDecoration(this,drawable, 5));