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>