Skip to content

Instantly share code, notes, and snippets.

@vic797
Last active April 23, 2023 23:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vic797/7155ec8591ddc6205033a73ea228f356 to your computer and use it in GitHub Desktop.
Save vic797/7155ec8591ddc6205033a73ea228f356 to your computer and use it in GitHub Desktop.
An iteration of a ViewPager2 adapter that displays data in a grid
<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/grid_pager_view"
android:horizontalSpacing="4dp"
android:verticalSpacing="4dp"
android:layout_width="match_parent"
android:layout_height="match_parent" />
import android.view.View
import android.widget.GridView
import androidx.recyclerview.widget.RecyclerView
import xyz.binary.foxlauncher.R
class GridPageHolder2(itemView: View) : RecyclerView.ViewHolder(itemView) {
val gridView: GridView = itemView.findViewById(R.id.grid_pager_view)
}
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.GridView
import androidx.recyclerview.widget.RecyclerView
import xyz.binary.foxlauncher.R
import java.util.*
import kotlin.collections.ArrayList
import kotlin.math.ceil
abstract class GridPagerAdapter2<T>(
val context: Context,
val columns: Int,
val rows: Int
) : RecyclerView.Adapter<GridPageHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): GridPageHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.grid_pager_page_layout2, parent, false)
return GridPageHolder(view).apply {
gridView.numColumns = columns
}
}
override fun getItemCount(): Int {
val itemsPerPage = columns * rows
var pages = round((getSize() / itemsPerPage).toDouble()).toInt()
val availableSlots = pages * itemsPerPage
if (getSize() - availableSlots > 0) {
pages += 1
}
return pages
}
override fun onBindViewHolder(holder: GridPageHolder, position: Int) {
val grid = holder.gridView
val maxItems = columns * rows
val offset = maxItems * position
val items = ArrayList<T>()
for (i in 0 until maxItems) {
try {
items.add(getItem(i + offset))
} catch (e: IndexOutOfBoundsException) {
break
}
}
grid.adapter = GridAdapter(context, items)
}
abstract fun getViewItem(item: T, convertView: View?, parent: ViewGroup): View
abstract fun getItem(position: Int): T
abstract fun getSize(): Int
inner class GridAdapter<R>(
context: Context,
val items: List<R>,
) : ArrayAdapter<R>(context, 0, items) {
constructor(context: Context) : this(context, Collections.emptyList())
@Suppress("UNCHECKED_CAST")
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val item: R = this.items[position]
val view = this@GridPagerAdapter.getViewItem(item as T, convertView, parent)
// TODO Listeners
return view
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment