RecyclerView沒有像之前ListView提供divider屬性怎囚,而是提供了方法
recyclerView.addItemDecoration()
其中ItemDecoration需要我們自己去定制重寫恳守,一開始可能有人會(huì)覺得麻煩不好用催烘,最后你會(huì)發(fā)現(xiàn)這種可插拔設(shè)計(jì)不僅好用伊群,而且功能強(qiáng)大在岂。
ItemDecoration類主要是三個(gè)方法:
//可以實(shí)現(xiàn)類似繪制背景的效果蔽午,內(nèi)容在上面
public void onDraw(Canvas c, RecyclerView parent, State state)
//可以繪制在內(nèi)容的上面及老,覆蓋內(nèi)容
public void onDrawOver(Canvas c, RecyclerView parent, State state)
//可以實(shí)現(xiàn)類似padding的效果
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, State state)
下面來具體看下效果如何:
我們沒有添加任何ItemDecoration的界面
重寫getItemOffsets方法
public class SimplePaddingDecoration extends RecyclerView.ItemDecoration {
private int dividerHeight;
public SimplePaddingDecoration(Context context) {
dividerHeight = context.getResources().getDimensionPixelSize(R.dimen.divider_height);
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
outRect.bottom = dividerHeight;//類似加了一個(gè)bottom padding
}
}
沒錯(cuò),就這么2行代碼僧鲁,然后添加到RecyclerView
recyclerView.addItemDecoration(new SimplePaddingDecoration(this));
實(shí)現(xiàn)效果:
重寫OnDraw方法
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
//先初始化一個(gè)Paint來簡(jiǎn)單指定一下Canvas的顏色,就黑的吧寞秃!
Paint paint = new Paint();
paint.setStrokeWidth(size);
paint.setColor(ContextCompat.getColor(parent.getContext(), line_color));
//獲得RecyclerView中總條目數(shù)量
int childCount = parent.getChildCount();
//遍歷一下
for (int i = 0; i < childCount; i++) {
if (i == 0 || i == childCount || i == childCount - 1) {
//如果是第一個(gè)條目斟叼,那么我們就不畫邊框了
continue;
}
//獲得子View,也就是一個(gè)條目的View春寿,準(zhǔn)備給他畫上邊框
View childView = parent.getChildAt(i);
//先獲得子View的長(zhǎng)寬朗涩,以及在屏幕上的位置,方便我們得到邊框的具體坐標(biāo)
float x = childView.getX();
float y = childView.getY();
int width = childView.getWidth();
int height = childView.getHeight();
c.drawLine(x + margin, y, x + width - margin, y, paint);
super.onDrawOver(c, parent, state);
}
}
實(shí)現(xiàn)效果:
重寫OnDrawOver方法
此方法和OnDraw方法大同小異绑改,唯一的區(qū)別便是:OnDrawOver是在你的item上層繪制谢床,例如:當(dāng)你的item設(shè)置了background時(shí),OnDraw方法繪制的內(nèi)容會(huì)被item的background所遮蓋厘线,而OnDrawOver則不會(huì)识腿。