package com.example.firstapp.adapter
|
|
import android.view.LayoutInflater
|
import android.view.ViewGroup
|
import androidx.recyclerview.widget.DiffUtil
|
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.ListAdapter
|
import androidx.recyclerview.widget.RecyclerView
|
import com.example.firstapp.databinding.ItemIncomeGroupBinding
|
import com.example.firstapp.databinding.ItemIncomePackageHomeBinding
|
import com.example.firstapp.model.IncomeGroup
|
import com.example.firstapp.model.IncomePackage
|
|
class IncomeAdapter : ListAdapter<IncomeGroup, IncomeAdapter.ViewHolder>(IncomeGroupDiffCallback()) {
|
|
private var onPackageClickListener: (IncomeGroup, IncomePackage) -> Unit = { _, _ -> }
|
|
fun setOnPackageClickListener(listener: (IncomeGroup, IncomePackage) -> Unit) {
|
onPackageClickListener = listener
|
}
|
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
val binding = ItemIncomeGroupBinding.inflate(
|
LayoutInflater.from(parent.context), parent, false
|
)
|
return ViewHolder(binding)
|
}
|
|
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
val group = getItem(position)
|
holder.bind(group)
|
}
|
|
inner class ViewHolder(private val binding: ItemIncomeGroupBinding) :
|
RecyclerView.ViewHolder(binding.root) {
|
private val packagesAdapter = IncomePackageHomeAdapter { pack ->
|
currentGroup?.let { group ->
|
onPackageClickListener(group, pack)
|
}
|
}
|
private var currentGroup: IncomeGroup? = null
|
|
init {
|
binding.rvPackages.apply {
|
layoutManager = object : LinearLayoutManager(context) {
|
override fun canScrollVertically(): Boolean {
|
return false
|
}
|
|
override fun onLayoutChildren(recycler: RecyclerView.Recycler, state: RecyclerView.State) {
|
try {
|
super.onLayoutChildren(recycler, state)
|
} catch (e: IndexOutOfBoundsException) {
|
// 捕获可能的异常,防止崩溃
|
}
|
}
|
}
|
adapter = packagesAdapter
|
isNestedScrollingEnabled = false
|
setItemViewCacheSize(20)
|
setHasFixedSize(true)
|
}
|
}
|
|
fun bind(group: IncomeGroup) {
|
currentGroup = group
|
binding.tvStationName.text = group.stationName
|
binding.tvPackageCount.text = "共${group.packages.size}笔收入"
|
|
packagesAdapter.submitList(null)
|
packagesAdapter.submitList(group.packages)
|
|
binding.rvPackages.requestLayout()
|
}
|
}
|
}
|
|
class IncomePackageHomeAdapter(private val onPackageClick: (IncomePackage) -> Unit) :
|
ListAdapter<IncomePackage, IncomePackageHomeAdapter.ViewHolder>(IncomePackageDiffCallback()) {
|
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
val binding = ItemIncomePackageHomeBinding.inflate(
|
LayoutInflater.from(parent.context), parent, false
|
)
|
return ViewHolder(binding)
|
}
|
|
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
val pack = getItem(position)
|
holder.bind(pack)
|
}
|
|
override fun getItemCount(): Int {
|
return currentList.size
|
}
|
|
inner class ViewHolder(private val binding: ItemIncomePackageHomeBinding) :
|
RecyclerView.ViewHolder(binding.root) {
|
|
init {
|
binding.root.setOnClickListener {
|
val position = adapterPosition
|
if (position != RecyclerView.NO_POSITION) {
|
val pack = getItem(position)
|
onPackageClick(pack)
|
}
|
}
|
}
|
|
fun bind(pack: IncomePackage) {
|
binding.tvCompany.text = pack.company
|
binding.tvCreateTime.text = pack.createTime
|
binding.tvTrackingNumber.text = "¥${pack.trackingNumber}"
|
// binding.tvBalance.text = "余额: ¥${pack.balance}"
|
}
|
}
|
}
|
|
private class IncomeGroupDiffCallback : DiffUtil.ItemCallback<IncomeGroup>() {
|
override fun areItemsTheSame(oldItem: IncomeGroup, newItem: IncomeGroup): Boolean {
|
return oldItem.stationName == newItem.stationName
|
}
|
|
override fun areContentsTheSame(oldItem: IncomeGroup, newItem: IncomeGroup): Boolean {
|
return oldItem == newItem
|
}
|
}
|
|
private class IncomePackageDiffCallback : DiffUtil.ItemCallback<IncomePackage>() {
|
override fun areItemsTheSame(oldItem: IncomePackage, newItem: IncomePackage): Boolean {
|
return oldItem.id == newItem.id
|
}
|
|
override fun areContentsTheSame(oldItem: IncomePackage, newItem: IncomePackage): Boolean {
|
return oldItem == newItem
|
}
|
}
|