92 lines
3.0 KiB
Kotlin
92 lines
3.0 KiB
Kotlin
package com.sw.platecabinet.adapter
|
||
|
||
import android.view.LayoutInflater
|
||
import android.view.View
|
||
import android.view.ViewGroup
|
||
import androidx.recyclerview.widget.GridLayoutManager
|
||
import androidx.recyclerview.widget.RecyclerView
|
||
import androidx.viewbinding.ViewBinding
|
||
import com.sw.platecabinet.R
|
||
|
||
/**
|
||
* 通用分页适配器(支持ViewBinding)
|
||
*/
|
||
class GenericPageAdapter<T, VB : ViewBinding>(
|
||
private var pages: List<List<T>>,
|
||
private val pageLayoutId: Int,
|
||
private val itemBindingInflater: (LayoutInflater, ViewGroup, Boolean) -> VB,
|
||
private val itemBindCallback: VB.(item: T, position: Int) -> Unit
|
||
) : RecyclerView.Adapter<GenericPageAdapter<T, VB>.PageViewHolder>() {
|
||
|
||
fun updatePages(newPages: List<List<T>>) {
|
||
this.pages = newPages
|
||
notifyDataSetChanged()
|
||
}
|
||
|
||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PageViewHolder {
|
||
val view = LayoutInflater.from(parent.context).inflate(pageLayoutId, parent, false)
|
||
val holder = PageViewHolder(view)
|
||
|
||
// 在创建ViewHolder时设置ItemDecoration,只设置一次
|
||
holder.childRecyclerView.addItemDecoration(
|
||
GridSpacingItemDecoration(
|
||
spanCount = 2,
|
||
spacing = view.context.dpToPx(12),
|
||
includeEdge = true // 包含边缘间距
|
||
)
|
||
)
|
||
|
||
return holder
|
||
}
|
||
|
||
override fun onBindViewHolder(holder: PageViewHolder, position: Int) {
|
||
holder.bind(pages[position])
|
||
}
|
||
|
||
override fun getItemCount(): Int = pages.size
|
||
|
||
inner class PageViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
|
||
val childRecyclerView: RecyclerView = itemView.findViewById(R.id.childRecyclerView)
|
||
|
||
init {
|
||
childRecyclerView.layoutManager = GridLayoutManager(itemView.context, 2)
|
||
}
|
||
|
||
fun bind(items: List<T>) {
|
||
childRecyclerView.adapter =
|
||
GenericItemAdapter(items, itemBindingInflater, itemBindCallback)
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 通用子项适配器(支持ViewBinding)
|
||
*/
|
||
class GenericItemAdapter<T, VB : ViewBinding>(
|
||
private var items: List<T>,
|
||
private val bindingInflater: (LayoutInflater, ViewGroup, Boolean) -> VB,
|
||
private val bindCallback: VB.(item: T, position: Int) -> Unit,
|
||
) : RecyclerView.Adapter<GenericItemAdapter<T, VB>.ViewHolder>() {
|
||
|
||
inner class ViewHolder(private val binding: VB) : RecyclerView.ViewHolder(binding.root) {
|
||
fun bind(item: T, position: Int) {
|
||
binding.bindCallback(item, position)
|
||
}
|
||
}
|
||
|
||
fun updateData(newItem: List<T>) {
|
||
this.items = newItem
|
||
notifyDataSetChanged()
|
||
}
|
||
|
||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
||
val binding = bindingInflater(LayoutInflater.from(parent.context), parent, false)
|
||
return ViewHolder(binding)
|
||
}
|
||
|
||
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
||
holder.bind(items[position], position)
|
||
}
|
||
|
||
override fun getItemCount(): Int = items.size
|
||
} |