GridLayoutManager ItemDecoration 左右边距小,中间平均分配

GridLayoutManager ItemDecoration 左右边距小,中间平均分配

GridLayoutDivideFragment类:
package com.example.androidkotlindemo2.gridlayout

import android.content.Context
import android.os.Bundle
import android.util.DisplayMetrics
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.GridLayoutManager
import com.example.androidkotlindemo2.R
import com.example.androidkotlindemo2.databinding.GridlayoutDivideMainBinding
import com.example.androidkotlindemo2.utils.LogUtils

/**
 * Author : wn
 * Email : maoning20080809@163.com
 * Date : 2024/9/8 15:13
 * Description : GridLayoutManager ItemDecoration 左右边距小,中间平均分配
 */
class GridLayoutDivideFragment : Fragment(){


    private lateinit var binding : GridlayoutDivideMainBinding

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding = GridlayoutDivideMainBinding.inflate(inflater, container, false)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)


        var datas = getData()
        var adapter = GridLayoutAdapter(datas)
        binding.gridlayoutRecyclerView.let {
            it.layoutManager = GridLayoutManager(requireActivity(), 3)
            var gridItemDecoration = GridItemDecoration(getHorizontalSpace(), 30)
            it.addItemDecoration(gridItemDecoration)
            it.adapter = adapter
        }
    }

    /**
     * 获取水平方向的空白
     */
    private fun getHorizontalSpace() : Int{
        //每个item的宽度
        var dp60 = resources.getDimensionPixelSize(R.dimen.dp_60)
        //RecyclerView左右间距的宽度
        var dp12 = resources.getDimensionPixelSize(R.dimen.dp_12)
        var screenWidth = getScreenWidth(requireActivity())
        //除以2是3个item,2个空白间距
        var horizontalSpace = (screenWidth - 3 * dp60 - 2 * dp12) / 2
        LogUtils.i("AAA", "getHorizontalSpace ${screenWidth} , ${dp60} , ${horizontalSpace}")
        return horizontalSpace
    }

    fun getScreenWidth(context: Context): Int {
        val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
        val metrics = DisplayMetrics()
        windowManager.defaultDisplay.getMetrics(metrics)
        LogUtils.i("AAA", "getScreenWidth ${metrics.density} ${metrics.widthPixels} , ${metrics.heightPixels} , ${metrics.densityDpi} , ${metrics.scaledDensity}")
        return metrics.widthPixels
    }

    private fun getData() : MutableList<GridLayoutBean>{

        var urls = arrayListOf<String>(
            "https://img.duoziwang.com/2016/09/02/16135043775.jpg",
            "https://img.woyaogexing.com/2016/03/18/c4df209cad1840bb%21200x200.jpg",
            "http://img.duoziwang.com/2016/11/21/13565441404.jpg",
            "http://img.duoziwang.com/2016/11/29/220134634.jpg",
            "https://tupian.qqw21.com/article/UploadPic/2018-3/20183817105179447.jpg",
            "http://img.duoziwang.com/2021/01/1618554889818120.jpg",
        )
        var datas = mutableListOf<GridLayoutBean>()
        for(i in 0 until urls.size){
            var gridLayoutBean = GridLayoutBean()
            gridLayoutBean.id = i
            gridLayoutBean.name = "测试${i}"
            gridLayoutBean.url = urls[i]
            datas.add(gridLayoutBean)
        }
        return datas
    }


}
GridLayoutAdapter类:
package com.example.androidkotlindemo2.gridlayout

import android.widget.ImageView
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.viewholder.BaseViewHolder
import com.example.androidkotlindemo2.MyApp
import com.example.androidkotlindemo2.R
import com.example.androidkotlindemo2.utils.LogUtils

/**
 * Author : wn
 * Email : maoning20080809@163.com
 * Date : 2024/9/8 15:17
 * Description :
 */
class GridLayoutAdapter(list : MutableList<GridLayoutBean>)
    : BaseQuickAdapter<GridLayoutBean , BaseViewHolder>(R.layout.gridlayout_divide_item, list)  {

    override fun convert(holder: BaseViewHolder, item: GridLayoutBean) {

        holder.setText(R.id.grid_layout_item_name, item.name)
        LogUtils.i("AAA", "position : ${holder.layoutPosition}, ${item.name} ,${item.url}")
        holder.getView<ImageView>(R.id.grid_layout_item_img).let{
            Glide.with(MyApp.myApp).load(item.url).placeholder(R.mipmap.ic_launcher).error(R.mipmap.ic_launcher).into(it)
        }

    }
}

GridItemDecoration类:
package com.example.androidkotlindemo2.gridlayout

import android.graphics.Rect
import android.view.View
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.example.androidkotlindemo2.utils.LogUtils

/**
 * Author : wn
 * Email : maoning20080809@163.com
 * Date : 2024/9/8 15:56
 * Description :
 */
class GridItemDecoration(horizontal: Int, vertical: Int): RecyclerView.ItemDecoration() {
    private val spaceHorizontal by lazy { horizontal }
    private val spaceVertical by lazy { vertical }
    private var spanCount = -1

    override fun getItemOffsets(
        outRect: Rect,
        view: View,
        parent: RecyclerView,
        state: RecyclerView.State
    ) {
        if (parent.layoutManager is GridLayoutManager) {
            if (spanCount == -1) {
                spanCount =
                    (parent.layoutManager as GridLayoutManager).spanCount
            }
            val position = parent.getChildAdapterPosition(view)
            /* 绘制垂直边距 */
            if (position >= spanCount) { //第一行之外绘制垂直边距
                outRect.top = spaceVertical
            }
            /* 绘制水平边距 */
            val pInLine: Int = position % spanCount // 行内位置
            if (pInLine == 0) {
                outRect.left = 0
            } else {
                outRect.left = (pInLine * 1f * spaceHorizontal / spanCount).toInt()
            }
            outRect.right = ((spanCount - pInLine - 1) * 1f * spaceHorizontal / spanCount).toInt()
        } else {
            LogUtils.e("GridItemDecoration", "layoutManager isn't GridLayoutManager")
        }
    }
}

GridLayoutBean类:
package com.example.androidkotlindemo2.gridlayout

/**
 * Author : wn
 * Email : maoning20080809@163.com
 * Date : 2024/9/8 15:18
 * Description :
 */
class GridLayoutBean {

    var id :Int = 0

    var name : String = ""

    var url : String = ""

}

gridlayout_divide_main.xml布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:textColor="@color/red"
        android:textSize="30sp"
        android:layout_marginBottom="30dp"
        android:text="九宫格平分"/>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/gridlayout_recycler_view"
        android:layout_marginHorizontal="12dp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

gridlayout_divide_item.xml布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="60dp"
    android:layout_height="wrap_content"
    android:orientation="vertical">


    <TextView
        android:id="@+id/grid_layout_item_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:textColor="@color/red"
        android:textSize="22sp"
        android:text="测试1"/>

    <ImageView
        android:id="@+id/grid_layout_item_img"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@mipmap/ic_launcher"/>

</LinearLayout>

  • 12
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
HTML中的上下左右边距可以通过CSS的margin属性来设置。margin属性是一个复合属性,可以设置上、右、下、左四个方向的边距。其语法格式如下: ```css margin: 上边距边距边距边距; ``` 其中,上下左右边距可以单独设置,也可以组合设置。例如: ```css margin-top: 10px; /* 设置上边距为10像素 */ margin-right: 20px; /* 设置右边距为20像素 */ margin-bottom: 30px; /* 设置下边距为30像素 */ margin-left: 40px; /* 设置左边距为40像素 */ ``` 也可以使用缩写形式来设置上下左右边距,例如: ```css margin: 10px 20px 30px 40px; /* 分别设置上、右、下、左边距为10、20、30、40像素 */ margin: 10px 20px 30px; /* 分别设置上、右、下边距为10、20、30像素,左边距为0 */ margin: 10px 20px; /* 分别设置上下边距为10像素,左右边距为20像素 */ margin: 10px; /* 设置上下左右边距均为10像素 */ ``` 除了margin属性,还有padding属性可以设置HTML元素的内边距。padding属性的语法格式与margin属性类似,也是一个复合属性,可以设置上、右、下、左四个方向的内边距。例如: ```css padding: 10px; /* 设置上下左右边距均为10像素 */ padding: 10px 20px; /* 分别设置上下内边距为10像素,左右边距为20像素 */ padding: 10px 20px 30px; /* 分别设置上内边距为10像素,左右边距为20像素,下内边距为30像素 */ padding: 10px 20px 30px 40px; /* 分别设置上右下左内边距为10、20、30、40像素 */ ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

六毛六66

你的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值