实现GridLayoutManager 平均间距的ItemDecoration

计算原理查看文章:RecyclerView GridLayoutManger平分间距问题

package com.trs.v8.main.module.providers.mutil_line;

import android.graphics.Canvas;
import android.graphics.Rect;
import android.util.Log;
import android.view.View;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

/**
 * 
 * Created by zhuguohui
 * Date: 2023/11/23
 * Time: 17:51
 * Desc:
 * 和GridLayoutManager搭配,可以实现所有item。前后左右的间距都是一样的
 * 计算原理查看文章:https://juejin.cn/post/6989596537147883528
 * 
*/
class AverageGridSpacingItemDecoration extends RecyclerView.ItemDecoration { private static final String TAG = AverageGridSpacingItemDecoration.class.getSimpleName(); int spanCount; /** *
     * @param spanCount 每一行有多少个item
     * @param itemSpace 每个item之间的间距。为什么要传入固定值,
     *                  因为在{@link #getItemOffsets(Rect, View, RecyclerView, RecyclerView.State)}方法中,
     *                  不一定能获取到recycleView的宽度,导致间距不一定能计算出来。
     *                  间距的计算方法是(RecycleView的宽度-spanCount*item的宽度)/(spanCount+1)
     *
*/
public AverageGridSpacingItemDecoration(int spanCount, int itemSpace) { this.spanCount = spanCount; this.itemSpace = itemSpace; //要计算left边距,和right边距,在GridLayoutManager中item的宽度 int remainWidth =itemSpace *( spanCount+1); // p为每个Item都需要减去的间距 p = remainWidth / spanCount; } int itemSpace = -1; int p; @Override public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { int position = parent.getChildAdapterPosition(view); // 获取第几列 int column = position % spanCount; // 第几行 int row = position / spanCount; if (row == 0) { // 设置top outRect.top = itemSpace; } int left = itemSpace + column * (itemSpace - p); int right = p - left; outRect.left = Math.round(left); outRect.right = Math.round(right); outRect.bottom=itemSpace; Log.i(TAG, "getItemOffsets: position="+position+" left="+left+" right="+right); } @Override public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { super.onDraw(c, parent, state); } }

你可能感兴趣的:(android)