cloudroam
7 天以前 0cf0870889d65f5d11d0b2c8af7bca9442a7ba19
app/src/main/java/com/example/firstapp/adapter/ExpressAdapter.kt
@@ -14,7 +14,7 @@
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) {
@@ -34,7 +34,7 @@
        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 ->
@@ -44,9 +44,29 @@
        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)
            }
        }
@@ -54,7 +74,28 @@
            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
                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) {
@@ -65,9 +106,9 @@
}
// 首页使用的包裹适配器 - 简化版本
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
@@ -80,26 +121,51 @@
        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("邮政") || companyName.contains("ems") -> R.drawable.express_package_youzheng
                companyName.contains("极兔") -> R.drawable.express_package_jitu
                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 = ""
@@ -123,25 +189,51 @@
        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("邮政") || companyName.contains("ems") -> R.drawable.express_package_youzheng
                companyName.contains("极兔") -> R.drawable.express_package_jitu
                else -> R.drawable.express_normal
            }
            binding.ivCompanyLogo.setImageResource(logoResId)
        }
    }
}
@@ -164,4 +256,4 @@
    override fun areContentsTheSame(oldItem: ExpressPackage, newItem: ExpressPackage): Boolean {
        return oldItem == newItem
    }
}
}