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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

王宁-Android

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

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

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

打赏作者

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

抵扣说明:

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

余额充值