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( private var pages: List>, private val pageLayoutId: Int, private val itemBindingInflater: (LayoutInflater, ViewGroup, Boolean) -> VB, private val itemBindCallback: VB.(item: T, position: Int) -> Unit ) : RecyclerView.Adapter.PageViewHolder>() { fun updatePages(newPages: List>) { 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) { childRecyclerView.adapter = GenericItemAdapter(items, itemBindingInflater, itemBindCallback) } } } /** * 通用子项适配器(支持ViewBinding) */ class GenericItemAdapter( private var items: List, private val bindingInflater: (LayoutInflater, ViewGroup, Boolean) -> VB, private val bindCallback: VB.(item: T, position: Int) -> Unit, ) : RecyclerView.Adapter.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) { 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 }