| | |
| | | import com.example.firstapp.databinding.ItemExpressPackageHomeBinding |
| | | |
| | | class ExpressAdapter : ListAdapter<ExpressGroup, ExpressAdapter.ViewHolder>(ExpressGroupDiffCallback()) { |
| | | |
| | | |
| | | private var onPackageClickListener: (ExpressGroup, ExpressPackage) -> Unit = { _, _ -> } |
| | | |
| | | fun setOnPackageClickListener(listener: (ExpressGroup, ExpressPackage) -> Unit) { |
| | |
| | | holder.setOnPackageClickListener(onPackageClickListener) |
| | | } |
| | | |
| | | inner class ViewHolder(private val binding: ItemExpressGroupBinding) : |
| | | inner class ViewHolder(private val binding: ItemExpressGroupBinding) : |
| | | RecyclerView.ViewHolder(binding.root) { |
| | | private val packagesAdapter = ExpressPackageHomeAdapter { pack -> |
| | | currentGroup?.let { group -> |
| | |
| | | private var currentGroup: ExpressGroup? = null |
| | | |
| | | init { |
| | | // 设置固定高度和禁用嵌套滚动来解决滑动问题 |
| | | binding.rvPackages.apply { |
| | | layoutManager = LinearLayoutManager(context) |
| | | layoutManager = object : LinearLayoutManager(context) { |
| | | override fun canScrollVertically(): Boolean { |
| | | // 禁用内部RecyclerView的垂直滚动 |
| | | return false |
| | | } |
| | | |
| | | // 确保测量所有子项,防止部分内容不可见 |
| | | override fun onLayoutChildren(recycler: RecyclerView.Recycler, state: RecyclerView.State) { |
| | | try { |
| | | super.onLayoutChildren(recycler, state) |
| | | } catch (e: IndexOutOfBoundsException) { |
| | | // 捕获可能的异常,防止崩溃 |
| | | } |
| | | } |
| | | } |
| | | adapter = packagesAdapter |
| | | // 禁用嵌套滚动,让外部RecyclerView处理所有滚动 |
| | | isNestedScrollingEnabled = false |
| | | // 启用回收视图缓存 |
| | | setItemViewCacheSize(20) |
| | | setHasFixedSize(true) |
| | | } |
| | | } |
| | | |
| | |
| | | currentGroup = group |
| | | binding.tvStationName.text = group.stationName |
| | | binding.tvPackageCount.text = "共${group.packages.size}个包裹" |
| | | |
| | | // 根据驿站名称设置相应的图标 |
| | | val stationName = group.stationName.lowercase() |
| | | val stationIconResId = when { |
| | | stationName.isEmpty() || stationName == "未知" -> R.drawable.express_normal |
| | | stationName.contains("菜鸟") -> R.drawable.express_cainiao |
| | | stationName.contains("多多") -> R.drawable.express_duoduo |
| | | stationName.contains("兔喜") -> R.drawable.express_tuxi |
| | | stationName.contains("妈妈") -> R.drawable.express_mama |
| | | stationName.contains("小兵") -> R.drawable.express_xiaobing |
| | | stationName.contains("蓝店") -> R.drawable.express_landian |
| | | stationName.contains("丰巢") -> R.drawable.express_fengchao |
| | | else -> R.drawable.express_normal |
| | | } |
| | | |
| | | binding.ivStationIcon.setImageResource(stationIconResId) |
| | | |
| | | // 确保所有数据都被更新 |
| | | packagesAdapter.submitList(null) |
| | | packagesAdapter.submitList(group.packages) |
| | | |
| | | // 请求布局刷新 |
| | | binding.rvPackages.requestLayout() |
| | | } |
| | | |
| | | fun setOnPackageClickListener(listener: (ExpressGroup, ExpressPackage) -> Unit) { |
| | |
| | | } |
| | | |
| | | // 首页使用的包裹适配器 - 简化版本 |
| | | class ExpressPackageHomeAdapter(private val onPackageClick: (ExpressPackage) -> Unit) : |
| | | class ExpressPackageHomeAdapter(private val onPackageClick: (ExpressPackage) -> Unit) : |
| | | ListAdapter<ExpressPackage, ExpressPackageHomeAdapter.ViewHolder>(ExpressPackageDiffCallback()) { |
| | | |
| | | |
| | | override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { |
| | | val binding = ItemExpressPackageHomeBinding.inflate( |
| | | LayoutInflater.from(parent.context), parent, false |
| | |
| | | holder.bind(pack) |
| | | } |
| | | |
| | | inner class ViewHolder(private val binding: ItemExpressPackageHomeBinding) : |
| | | // 防止部分内容不显示 |
| | | override fun getItemCount(): Int { |
| | | return currentList.size |
| | | } |
| | | |
| | | inner class ViewHolder(private val binding: ItemExpressPackageHomeBinding) : |
| | | RecyclerView.ViewHolder(binding.root) { |
| | | |
| | | |
| | | init { |
| | | binding.root.setOnClickListener { |
| | | val pack = getItem(adapterPosition) |
| | | onPackageClick(pack) |
| | | val position = adapterPosition |
| | | if (position != RecyclerView.NO_POSITION) { |
| | | val pack = getItem(position) |
| | | onPackageClick(pack) |
| | | } |
| | | } |
| | | } |
| | | |
| | | fun bind(pack: ExpressPackage) { |
| | | binding.tvPackageInfo.text = "${pack.company} - ${pack.trackingNumber}" |
| | | binding.tvCompany.text = pack.company |
| | | binding.tvCreateTime.text = pack.createTime |
| | | binding.tvTrackingNumber.text = pack.trackingNumber |
| | | |
| | | // 根据快递公司名称设置相应的图标 |
| | | val companyName = pack.company.lowercase() |
| | | val logoResId = when { |
| | | companyName.isEmpty() || companyName == "未知" -> R.drawable.reminder_package_express |
| | | companyName.contains("顺丰") -> R.drawable.express_package_shunfeng |
| | | companyName.contains("韵达") -> R.drawable.express_package_yunda |
| | | companyName.contains("圆通") -> R.drawable.express_package_yuantong |
| | | companyName.contains("申通") -> R.drawable.express_package_shentong |
| | | companyName.contains("中通") -> R.drawable.express_package_zhongtong |
| | | companyName.contains("邮政") || companyName.contains("ems") -> R.drawable.express_package_youzheng |
| | | companyName.contains("极兔") -> R.drawable.express_package_jitu |
| | | companyName.contains("丰巢") -> R.drawable.express_fengchao |
| | | else -> R.drawable.express_normal |
| | | } |
| | | |
| | | binding.ivCompanyLogo.setImageResource(logoResId) |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 取件页面使用的包裹适配器 |
| | | class ExpressPackageAdapter(private val onPackagePickup: (ExpressPackage) -> Unit = { _ -> }) : |
| | | class ExpressPackageAdapter(private val onPackagePickup: (ExpressPackage) -> Unit = { _ -> }) : |
| | | ListAdapter<ExpressPackage, ExpressPackageAdapter.ViewHolder>(ExpressPackageDiffCallback()) { |
| | | |
| | | |
| | | private var onPackageClickListener: (ExpressPackage) -> Unit = {} |
| | | private var stationName: String = "" |
| | | |
| | |
| | | holder.bind(pack) |
| | | } |
| | | |
| | | inner class ViewHolder(private val binding: ItemPackageBinding) : |
| | | // 防止部分内容不显示 |
| | | override fun getItemCount(): Int { |
| | | return currentList.size |
| | | } |
| | | |
| | | inner class ViewHolder(private val binding: ItemPackageBinding) : |
| | | RecyclerView.ViewHolder(binding.root) { |
| | | |
| | | |
| | | init { |
| | | binding.ivPackageStatus.setOnClickListener { |
| | | val pack = getItem(adapterPosition) |
| | | onPackagePickup(pack) |
| | | val position = adapterPosition |
| | | if (position != RecyclerView.NO_POSITION) { |
| | | val pack = getItem(position) |
| | | onPackagePickup(pack) |
| | | } |
| | | } |
| | | |
| | | |
| | | binding.root.setOnClickListener(null) |
| | | } |
| | | |
| | | fun bind(pack: ExpressPackage) { |
| | | binding.tvPackageInfo.text = "${pack.company} - ${pack.trackingNumber}" |
| | | binding.tvPackageId.text = pack.id.toString() |
| | | binding.tvCompany.text = pack.company |
| | | binding.tvCreateTime.text = pack.createTime |
| | | binding.tvTrackingNumber.text = pack.trackingNumber |
| | | binding.ivPackageStatus.setImageResource( |
| | | // if (pack.isPickedUp) R.drawable.circle_checked |
| | | // else R.drawable.circle |
| | | R.drawable.circle |
| | | ) |
| | | |
| | | // 根据快递公司名称设置相应的图标 |
| | | val companyName = pack.company.lowercase() |
| | | val logoResId = when { |
| | | companyName.isEmpty() || companyName == "未知" -> R.drawable.reminder_package_express |
| | | companyName.contains("顺丰") -> R.drawable.express_package_shunfeng |
| | | companyName.contains("韵达") -> R.drawable.express_package_yunda |
| | | companyName.contains("圆通") -> R.drawable.express_package_yuantong |
| | | companyName.contains("申通") -> R.drawable.express_package_shentong |
| | | companyName.contains("中通") -> R.drawable.express_package_zhongtong |
| | | companyName.contains("邮政") || companyName.contains("ems") -> R.drawable.express_package_youzheng |
| | | companyName.contains("极兔") -> R.drawable.express_package_jitu |
| | | companyName.contains("丰巢") -> R.drawable.express_fengchao |
| | | else -> R.drawable.express_normal |
| | | } |
| | | |
| | | binding.ivCompanyLogo.setImageResource(logoResId) |
| | | } |
| | | } |
| | | } |
| | |
| | | override fun areContentsTheSame(oldItem: ExpressPackage, newItem: ExpressPackage): Boolean { |
| | | return oldItem == newItem |
| | | } |
| | | } |
| | | } |