RecyclerView
現(xiàn)在開發(fā)Android的都知道,RecyclerView可以替代ListView和GridView猴仑,因為它的自由度很高,我們可以很隨意的展示我們的數(shù)據(jù)集肥哎,還有默認(rèn)的動畫辽俗!但是有一個瑕疵,那就是沒有提供一個分隔線的實現(xiàn)類篡诽,只有一個抽象類(RecyclerView.ItemDecoration)等著我們自己去實現(xiàn)崖飘!不過實現(xiàn)起來還是很簡單的。
自定義ItemDecoration的步驟(我以豎向舉例)
- 新建一個類杈女,繼承自RecyclerView.ItemDecoration
- 把各個item之間的距離加大朱浴!留出空間給我們要繪制的分隔線。所以要重寫
getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state)
方法达椰,設(shè)置偏移量翰蠢! - 繪制分隔線到上面設(shè)置的間距,重寫
onDraw()
方法啰劲。
代碼實現(xiàn)
public class MyItemDecoration extends RecyclerView.ItemDecoration {
//分隔線
Drawable mDivider;
//我們通過獲取系統(tǒng)屬性中的listDivider來添加梁沧,在系統(tǒng)中的AppTheme中設(shè)置
public static final int[] ATRRS = new int[]{
android.R.attr.listDivider
};
public MyItemDecoration(Context context, int orientation){
TypedArray ta = context.obtainStyledAttributes(ATRRS);
mDivider = ta.getDrawable(0);
ta.recycle();
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
int pos =parent.getChildLayoutPosition(view);//得到當(dāng)前view的位置
if(pos != parent.getAdapter().getItemCount()-1) {//如果不是最后一個view 那么留出空間
//設(shè)置paddingLeft,paddingTop呈枉, paddingRight趁尼, paddingBottom
outRect.set(0,0,0,mDivider.getIntrinsicHeight());
//mDivider.getIntrinsicHeight()是獲取我們定義的分隔線的高度!
}
}
}
我們可以看到已經(jīng)有白色的空間了猖辫!我們想用自定義的顏色去填充它酥泞,接來下我們先在drawable目錄下建一個shape,作為我們的divider:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/grey"></solid>
<size android:height="4dp"></size>
</shape>
然后在styles的主題AppTheme里設(shè)置:
<item name="android:listDivider">@drawable/divider_bg</item>
然后我們繼續(xù)繪制我們的分隔線啃憎,重寫onDraw()方法:
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
//設(shè)置分隔線的left和right
int left = parent.getPaddingLeft();
int right = parent.getWidth() - parent.getPaddingRight();
for (int i = 0; i < parent.getChildCount(); i++) {
View view = parent.getChildAt(i);
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) view.getLayoutParams();
//分隔線的top和bottom
int top = view.getBottom()+params.bottomMargin;
int bottom = top + mDivider.getIntrinsicHeight();
//分隔線的繪制區(qū)域
mDivider.setBounds(left,top,right,bottom);
//把分隔線繪制到canvas
mDivider.draw(c);
}
}
然后運行結(jié)果:
我們可以在shape中畫出漸變效果芝囤,然后分隔符就變成這樣了:
到此我們就完工了,很簡單辛萍,只需要重寫兩個方法就可以了悯姊!
下一篇:繪制分組懸浮分隔欄