android: Use autofit grid for games fragment
parent
9cb7e7072d
commit
3878c6ced1
@ -0,0 +1,61 @@
|
||||
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
package org.yuzu.yuzu_emu.layout
|
||||
|
||||
import android.content.Context
|
||||
import androidx.recyclerview.widget.GridLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import androidx.recyclerview.widget.RecyclerView.Recycler
|
||||
import org.yuzu.yuzu_emu.R
|
||||
|
||||
/**
|
||||
* Cut down version of the solution provided here
|
||||
* https://stackoverflow.com/questions/26666143/recyclerview-gridlayoutmanager-how-to-auto-detect-span-count
|
||||
*/
|
||||
class AutofitGridLayoutManager(
|
||||
context: Context,
|
||||
columnWidth: Int
|
||||
) : GridLayoutManager(context, 1) {
|
||||
private var columnWidth = 0
|
||||
private var isColumnWidthChanged = true
|
||||
private var lastWidth = 0
|
||||
private var lastHeight = 0
|
||||
|
||||
init {
|
||||
setColumnWidth(checkedColumnWidth(context, columnWidth))
|
||||
}
|
||||
|
||||
private fun checkedColumnWidth(context: Context, columnWidth: Int): Int {
|
||||
var newColumnWidth = columnWidth
|
||||
if (newColumnWidth <= 0) {
|
||||
newColumnWidth = context.resources.getDimensionPixelSize(R.dimen.spacing_xtralarge)
|
||||
}
|
||||
return newColumnWidth
|
||||
}
|
||||
|
||||
private fun setColumnWidth(newColumnWidth: Int) {
|
||||
if (newColumnWidth > 0 && newColumnWidth != columnWidth) {
|
||||
columnWidth = newColumnWidth
|
||||
isColumnWidthChanged = true
|
||||
}
|
||||
}
|
||||
|
||||
override fun onLayoutChildren(recycler: Recycler, state: RecyclerView.State) {
|
||||
val width = width
|
||||
val height = height
|
||||
if (columnWidth > 0 && width > 0 && height > 0 && (isColumnWidthChanged || lastWidth != width || lastHeight != height)) {
|
||||
val totalSpace: Int = if (orientation == VERTICAL) {
|
||||
width - paddingRight - paddingLeft
|
||||
} else {
|
||||
height - paddingTop - paddingBottom
|
||||
}
|
||||
val spanCount = 1.coerceAtLeast(totalSpace / columnWidth)
|
||||
setSpanCount(spanCount)
|
||||
isColumnWidthChanged = false
|
||||
}
|
||||
lastWidth = width
|
||||
lastHeight = height
|
||||
super.onLayoutChildren(recycler, state)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue