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

歡迎訪問 生活随笔!

生活随笔

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

Android

Android Recyclerview的item间距实现

發布時間:2023/11/21 Android 63 coder
生活随笔 收集整理的這篇文章主要介紹了 Android Recyclerview的item间距实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Recyclerview中,提供了一個方法addItemDecoration給我們用于設置item的分割線

下面提供幾個常見的分割線效果

注: 下面的SizeUtils是AndroidUtilCode此庫里的工具類,需要添加依賴,也可以自行修改封裝的方法(主要是將dp單位轉為px)

以下代碼已封裝在我的庫中stars-one/XAndroidUtil: 封裝自己常用的一些Android的組件或工具,可以直接依賴使用

注意庫中的類名與本文例子有所變化,自行參考庫的文檔說明

Linearlayout垂直排列每個item間隔

效果

代碼

/**
 * 
 * @param space 間距(單位px)
 */
class VerticalItemDecoration(val space: Int = SizeUtils.dp2px(12f)) :
    RecyclerView.ItemDecoration() {

    override fun getItemOffsets(
        outRect: Rect,
        view: View,
        parent: RecyclerView,
        state: RecyclerView.State
    ) {
        val position = parent.getChildAdapterPosition(view)

        val allCount = parent.adapter?.itemCount ?: 0

        //最后一個不加邊距
        if (position == allCount - 1) {
            return
        }

        outRect.bottom = space
    }
}

上面代碼實際就是在每個item后面添加一個間隔(最后一個則不加間隔)

PS: 實際上,這種簡單的可以直接在item的布局添加一個margin也可以實現

GridLayoutManager(類似九宮格布局)

UI的要求九宮格布局,需要中間有間隔,然后每行的幾個item的寬度需要平分該行剩余空間大小(除去間距)

效果

代碼

/**
 * 
 * @param spanCount 每行的item數目
 * @param space 間隔(單位px)
 */
class GridItemDecoration(val spanCount: Int = 3, val space: Int = SizeUtils.dp2px(8f)) :
    RecyclerView.ItemDecoration() {

    override fun getItemOffsets(
        outRect: Rect,
        view: View,
        parent: RecyclerView,
        state: RecyclerView.State
    ) {
        val position = parent.getChildAdapterPosition(view)
        val column = position % spanCount

        outRect.left = column * space / spanCount;
        outRect.right = space - (column + 1) * space / spanCount
        
        //item的上邊距,這里各位根據需求自己修改,也可以設置下邊距
        if (position >= spanCount) {
            outRect.top = space
        }
    }
}

為了方便在外層直接設置上下邊距,對上面的代碼新增一個參數

/**
 *
 * @param spanCount 每行的item數目
 * @param space 間隔(單位px)
 */
class GridItemDecoration(
    val spanCount: Int = 3,
    val space: Int = SizeUtils.dp2px(8f),
    val action: ((outRect: Rect, space: Int, position: Int) -> Unit)? = null
) :
    RecyclerView.ItemDecoration() {

    override fun getItemOffsets(
        outRect: Rect,
        view: View,
        parent: RecyclerView,
        state: RecyclerView.State
    ) {
        val position = parent.getChildAdapterPosition(view)
        val column = position % spanCount

        outRect.left = column * space / spanCount;
        outRect.right = space - (column + 1) * space / spanCount

        //上邊距,這里各位根據需求自己修改
        if (position >= spanCount) {
            outRect.top = space
            action?.invoke(outRect, space, position)
        }
    }
}

//使用
val itemDero = GridItemDecoration {outRect, space, position ->  }
mrecyclerview.addItemDecoration(itemDero)

補充

網格布局根據orientation從而展示item的順序不同

GridLayoutManager(context, 2).apply {
	orientation = RecyclerView.VERTICAL
}

如果是Vertical,則是一行行排列,一行滿足了spanCount則自動換行,如下面效果:
1 2
3 4

如果是HORIZONTAL,則是與一列列排列,每列滿足了spanCount則自動換行,如下面效果
1 3
2 4

總結

以上是生活随笔為你收集整理的Android Recyclerview的item间距实现的全部內容,希望文章能夠幫你解決所遇到的問題。

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