android gridview 间隔线,Android开发之RecyclerView的间隔线处理
RecyclerView沒有默認的分割線,需要自己繪制,接下來我會為大家繪制三種線:水平線、豎直線、和網格線。
廢話少說,馬上開車!!!
---------------------------------------------華麗的分割線------------------------------------------------------------
水平線實現:在原來的代碼中添加
mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
即可實現分割線,不過默認的分割線顏色個人感覺有點不太漂亮,大家看圖說話:
想要改變分割線的顏色只能在theme中添加該屬性
@drawable/divider_bg
然后在drawable中添加背景色
android:shape="rectangle">
android:centerColor="#ffff0000"
android:endColor="#ffff0000"
android:startColor="#ffff0000"
android:type="linear" />
為了看起來更亮眼我全部設置成了騷紅色,來大家看效果圖:
看一下gridview和瀑布流的效果:
---------------------------------------------華麗的分割線------------------------------------------------------------
豎直線:和水平線同樣的道理只需要改動一點代碼即可只需要把vertical改成horizontal即可。
mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.HORIZONTAL));
看效果圖:
---------------------------------------------華麗的分割線------------------------------------------------------------
網格線:大家估計該注意到問題了,像gridView網格狀的該怎么搞啊其實有個很簡單的方法,寫一個水平的然后在寫一個豎直的不就ok了嘛。。。
mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.HORIZONTAL));
mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
這是一種偷懶的方法,效果嘛就只能呵呵了,大家看效果圖:
丑丑丑。。。
---------------------------------------------華麗的分割線------------------------------------------------------------
網格線的優雅寫法:其實想解決這個問題,沒辦法只有看源碼了,源碼分析我就不帶大家分析了,大家有興趣的自己可以ctrl+鼠標左鍵自行查看,我這里的思路是:重寫ItemDecoration類,同時繪制水平和豎直線,當然了為了保證下面的線不能超過你的內容,需要加以判斷有多少行多少列。。。具體怎么實現的,代碼奉上:(感謝一下dn學院的ricky老師)
public class DividerGridViewItemDecoration extends RecyclerView.ItemDecoration {
private Drawable mDivider;
private int[] attrs = new int[]{android.R.attr.listDivider};
public DividerGridViewItemDecoration(Context context) {
TypedArray typedArray = context.obtainStyledAttributes(attrs);
mDivider = typedArray.getDrawable(0);
typedArray.recycle();
}
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
drawVertical(c, parent);
drawHorizontal(c, parent);
}
private void drawHorizontal(Canvas c, RecyclerView parent) {
// 繪制水平間隔線
int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
View child = parent.getChildAt(i);
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
int left = child.getLeft() - params.leftMargin;
int right = child.getRight() + params.rightMargin;
int top = child.getBottom() + params.bottomMargin;
int bottom = top + mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}
private void drawVertical(Canvas c, RecyclerView parent) {
//繪制垂直間隔線(垂直的矩形)
int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
View child = parent.getChildAt(i);
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
int left = child.getRight() + params.rightMargin;
int right = left + mDivider.getIntrinsicWidth();
int top = child.getTop() - params.topMargin;
int bottom = child.getBottom() + params.bottomMargin;
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}
@Override
@Deprecated
public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {
// 四個方向的偏移值
int right = mDivider.getIntrinsicWidth();
int bottom = mDivider.getIntrinsicHeight();
if (isLastColum(itemPosition, parent)) {//是否是最后一列
right = 0;
}
if (isLastRow(itemPosition, parent)) {//是最后一行
bottom = 0;
}
outRect.set(0, 0, right, bottom);
}
/**
* 是否是最后一行
*/
private boolean isLastRow(int itemPosition, RecyclerView parent) {
int spanCount = getSpanCount(parent);
RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
//有多少列
if (layoutManager instanceof GridLayoutManager) {
int childCount = parent.getAdapter().getItemCount();
int lastRowCount = childCount % spanCount;
//最后一行的數量小于spanCount
if (lastRowCount == 0 || lastRowCount < spanCount) {
return true;
}
}
return false;
}
/**
* 判斷是否是最后一列
*/
private boolean isLastColum(int itemPosition, RecyclerView parent) {
RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
//有多少列
if (layoutManager instanceof GridLayoutManager) {
int spanCount = getSpanCount(parent);
if ((itemPosition + 1) % spanCount == 0) {
return true;
}
}
return false;
}
private int getSpanCount(RecyclerView parent) {
RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
if (layoutManager instanceof GridLayoutManager) {
GridLayoutManager lm = (GridLayoutManager) layoutManager;
int spanCount = lm.getSpanCount();
return spanCount;
}
return 0;
}
}
然后添加一下代碼即可優雅的實現網格效果的線
DividerGridViewItemDecoration dividerGridViewItemDecoration = new DividerGridViewItemDecoration(this);
mRecyclerView.addItemDecoration(dividerGridViewItemDecoration);
效果圖走起:
---------------------------------------------華麗的分割線------------------------------------------------------------
下一節還是帶領大家繼續處理recyclerView的相關問題,還望大家支持。。。
總結
以上是生活随笔為你收集整理的android gridview 间隔线,Android开发之RecyclerView的间隔线处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 好看的html导航栏作品,精选10款超酷
- 下一篇: html滚动菜单置顶,javascrip