日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android gridview 间隔线,Android开发之RecyclerView的间隔线处理

發布時間:2025/4/5 Android 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的间隔线处理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。