LayoutManager获取可见的第一个和最后一个

95 阅读1分钟

一个Kotlin扩展函数来实现,可以用于RecyclerView的线性布局和瀑布流查找可见性的第一个和最后一个。

import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView.LayoutManager
import androidx.recyclerview.widget.StaggeredGridLayoutManager
import kotlin.math.max
import kotlin.math.min

fun LayoutManager.findVisiblePosition(): Pair<Int, Int> {
    return when (this) {
        is LinearLayoutManager -> {
            findVisiblePositionRange()
        }

        is StaggeredGridLayoutManager -> {
            findVisiblePositionRange()
        }

        else -> {
            throw IllegalArgumentException("非法参数")
        }
    }
}

/**
 * 线性布局管理器获取可见的第一个和可见的最后一个
 */
fun LinearLayoutManager.findVisiblePositionRange(): Pair<Int, Int> {
    val first = findFirstVisibleItemPosition()
    val last = findLastVisibleItemPosition()
    return Pair(first, last)
}

/**
 * 瀑布流获取可见的第一个和可见的最后一个
 */
fun StaggeredGridLayoutManager.findVisiblePositionRange(): Pair<Int, Int> {
    val firstVisibleItemPosition = findFirstVisibleItemPositions(null)
    val lastVisibleItemPosition = findLastVisibleItemPositions(null)
    val first = min(firstVisibleItemPosition[0], firstVisibleItemPosition[1])
    val last = max(lastVisibleItemPosition[0], lastVisibleItemPosition[1])
    return Pair(first, last)
}