From 88cf855268a05a68bb4570c6d45841bbe23fe5ec Mon Sep 17 00:00:00 2001 From: cloudroam <cloudroam> Date: 星期五, 25 四月 2025 13:44:26 +0800 Subject: [PATCH] 短信 --- app/src/main/java/com/example/firstapp/adapter/ExpressAdapter.kt | 195 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 186 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/example/firstapp/adapter/ExpressAdapter.kt b/app/src/main/java/com/example/firstapp/adapter/ExpressAdapter.kt index 2445433..3f2d7b2 100644 --- a/app/src/main/java/com/example/firstapp/adapter/ExpressAdapter.kt +++ b/app/src/main/java/com/example/firstapp/adapter/ExpressAdapter.kt @@ -6,12 +6,20 @@ import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.ListAdapter import com.example.firstapp.databinding.ItemExpressGroupBinding -import com.example.firstapp.databinding.ItemExpressPackageBinding import androidx.recyclerview.widget.DiffUtil import com.example.firstapp.model.ExpressGroup import com.example.firstapp.model.ExpressPackage +import com.example.firstapp.R +import com.example.firstapp.databinding.ItemPackageBinding +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) { + onPackageClickListener = listener + } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val binding = ItemExpressGroupBinding.inflate( @@ -23,30 +31,87 @@ override fun onBindViewHolder(holder: ViewHolder, position: Int) { val group = getItem(position) holder.bind(group) + holder.setOnPackageClickListener(onPackageClickListener) } - class ViewHolder(private val binding: ItemExpressGroupBinding) : RecyclerView.ViewHolder(binding.root) { - private val packagesAdapter = ExpressPackageAdapter() + inner class ViewHolder(private val binding: ItemExpressGroupBinding) : + RecyclerView.ViewHolder(binding.root) { + private val packagesAdapter = ExpressPackageHomeAdapter { pack -> + currentGroup?.let { group -> + onPackageClickListener(group, pack) + } + } + 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) } } fun bind(group: ExpressGroup) { + 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) { + // 这个方法可以移除,因为我们在构造 ExpressPackageHomeAdapter 时已经处理了点击事件 + // 或者保留这个方法但不做任何操作 } } } -class ExpressPackageAdapter : ListAdapter<ExpressPackage, ExpressPackageAdapter.ViewHolder>(ExpressPackageDiffCallback()) { +// 首页使用的包裹适配器 - 简化版本 +class ExpressPackageHomeAdapter(private val onPackageClick: (ExpressPackage) -> Unit) : + ListAdapter<ExpressPackage, ExpressPackageHomeAdapter.ViewHolder>(ExpressPackageDiffCallback()) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - val binding = ItemExpressPackageBinding.inflate( + val binding = ItemExpressPackageHomeBinding.inflate( LayoutInflater.from(parent.context), parent, false ) return ViewHolder(binding) @@ -57,11 +122,123 @@ holder.bind(pack) } - class ViewHolder(private val binding: ItemExpressPackageBinding) : RecyclerView.ViewHolder(binding.root) { + // 防止部分内容不显示 + override fun getItemCount(): Int { + return currentList.size + } + + inner class ViewHolder(private val binding: ItemExpressPackageHomeBinding) : + 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: ExpressPackage) { binding.tvCompany.text = pack.company + binding.tvCreateTime.text = pack.createTime binding.tvTrackingNumber.text = pack.trackingNumber - binding.tvDate.text = pack.date + + // 根据快递公司名称设置相应的图标 + 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 = { _ -> }) : + ListAdapter<ExpressPackage, ExpressPackageAdapter.ViewHolder>(ExpressPackageDiffCallback()) { + + private var onPackageClickListener: (ExpressPackage) -> Unit = {} + private var stationName: String = "" + + fun setStationInfo(station: String) { + stationName = station + } + + fun setOnPackageClickListener(listener: (ExpressPackage) -> Unit) { + onPackageClickListener = listener + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val binding = ItemPackageBinding.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: ItemPackageBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.ivPackageStatus.setOnClickListener { + val position = adapterPosition + if (position != RecyclerView.NO_POSITION) { + val pack = getItem(position) + onPackagePickup(pack) + } + } + + binding.root.setOnClickListener(null) + } + + fun bind(pack: ExpressPackage) { + 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) } } } @@ -84,4 +261,4 @@ override fun areContentsTheSame(oldItem: ExpressPackage, newItem: ExpressPackage): Boolean { return oldItem == newItem } -} \ No newline at end of file +} \ No newline at end of file -- Gitblit v1.9.3