cloudroam
2025-02-27 a69ed0d5eed84bea789463e718a2774122348685
add: 取件列表信息
已修改3个文件
已添加6个文件
366 ■■■■■ 文件已修改
app/src/main/AndroidManifest.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/activity/PickupActivity.kt 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/adapter/ExpressAdapter.kt 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/ui/home/HomeFragment.kt 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable/circle.png 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable/circle_indicator.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_pickup.xml 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/item_express_package_home.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/item_package.xml 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/AndroidManifest.xml
@@ -104,10 +104,9 @@
        <activity
            android:name=".activity.PhoneLoginActivity"
            android:exported="false" />
<!--        <activity-->
<!--            android:name=".ui.reminderOther.ReminderOtherAddActivity2"-->
<!--            android:label="新增提醒" />-->
        <activity
            android:name=".activity.PickupActivity"
            android:exported="false"/>
    </application>
app/src/main/java/com/example/firstapp/activity/PickupActivity.kt
对比新文件
@@ -0,0 +1,117 @@
package com.example.firstapp.activity
import android.os.Bundle
import android.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import com.example.firstapp.adapter.ExpressPackageAdapter
import com.example.firstapp.core.Core
import com.example.firstapp.databinding.ActivityPickupBinding
import com.example.firstapp.model.ExpressPackage
import kotlinx.coroutines.launch
class PickupActivity : AppCompatActivity() {
    private lateinit var binding: ActivityPickupBinding
    private lateinit var expressAdapter: ExpressPackageAdapter
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityPickupBinding.inflate(layoutInflater)
        setContentView(binding.root)
        initViews()
        loadData()
    }
    private fun initViews() {
        // 初始化适配器,传入取件回调
        expressAdapter = ExpressPackageAdapter { pack ->
            handleSinglePickup(pack)
        }
        binding.rvPackages.apply {
            layoutManager = LinearLayoutManager(this@PickupActivity)
            adapter = expressAdapter
        }
        binding.ivBack.setOnClickListener {
            finish()
        }
        // 修改底部按钮点击事件
        binding.btnPickupAll.setOnClickListener {
            showPickupConfirmDialog()
        }
    }
    private fun showPickupConfirmDialog() {
        AlertDialog.Builder(this)
            .setTitle("确认取件")
            .setMessage("是否确认取出所有包裹?")
            .setPositiveButton("确认") { _, _ ->
                handlePickupAll()
            }
            .setNegativeButton("取消", null)
            .show()
    }
    private fun handleSinglePickup(pack: ExpressPackage) {
        lifecycleScope.launch {
            try {
                // 处理单个包裹取件
//                Core.code.pickup(pack.trackingNumber)
                // 重新加载数据
                loadData()
                // 通知MainActivity刷新
                setResult(RESULT_OK)
            } catch (e: Exception) {
                // 处理错误
            }
        }
    }
    private fun handlePickupAll() {
        lifecycleScope.launch {
            try {
                // 获取当前所有包裹
                val packages = expressAdapter.currentList
                // 批量处理取件
                packages.forEach { pack ->
//                    Core.code.pickup(pack.trackingNumber)
                }
                // 清空列表
                expressAdapter.submitList(emptyList())
                // 更新包裹数量显示
                binding.tvPackageCount.text = "共0个包裹"
                // 通知MainActivity刷新
                setResult(RESULT_OK)
            } catch (e: Exception) {
                // 处理错误
                // 如果出错则重新加载数据
                loadData()
            }
        }
    }
    private fun loadData() {
        val stationName = intent.getStringExtra("station_name") ?: ""
        val company = intent.getStringExtra("company") ?: ""
        lifecycleScope.launch {
            val codes = Core.code.getByKeyword(stationName)
            val packages = codes.map { code ->
                ExpressPackage(
                    company = code.name ?: company,
                    trackingNumber = code.code,
                    date = code.overtime
                )
            }
            expressAdapter.submitList(packages)
            binding.tvStationName.text = stationName
            binding.tvPackageCount.text = "共${packages.size}个包裹"
        }
    }
}
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,10 +31,17 @@
    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 {
@@ -36,17 +51,25 @@
        }
        fun bind(group: ExpressGroup) {
            currentGroup = group
            binding.tvStationName.text = group.stationName
            binding.tvPackageCount.text = "共${group.packages.size}个包裹"
            packagesAdapter.submitList(group.packages)
        }
        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 +80,68 @@
        holder.bind(pack)
    }
    class ViewHolder(private val binding: ItemExpressPackageBinding) : RecyclerView.ViewHolder(binding.root) {
    inner class ViewHolder(private val binding: ItemExpressPackageHomeBinding) :
        RecyclerView.ViewHolder(binding.root) {
        init {
            binding.root.setOnClickListener {
                val pack = getItem(adapterPosition)
                onPackageClick(pack)
            }
        }
        fun bind(pack: ExpressPackage) {
            binding.tvCompany.text = pack.company
            binding.tvTrackingNumber.text = pack.trackingNumber
            binding.tvDate.text = pack.date
            binding.tvPackageInfo.text = "${pack.company} - ${pack.trackingNumber}"
        }
    }
}
// 取件页面使用的包裹适配器
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)
    }
    inner class ViewHolder(private val binding: ItemPackageBinding) :
        RecyclerView.ViewHolder(binding.root) {
        init {
            binding.ivPackageStatus.setOnClickListener {
                val pack = getItem(adapterPosition)
                onPackagePickup(pack)
            }
            binding.root.setOnClickListener(null)
        }
        fun bind(pack: ExpressPackage) {
            binding.tvPackageInfo.text = "${pack.company} - ${pack.trackingNumber}"
            binding.ivPackageStatus.setImageResource(
//                if (pack.isPickedUp) R.drawable.circle_checked
//                else R.drawable.circle
                R.drawable.circle
            )
        }
    }
}
app/src/main/java/com/example/firstapp/ui/home/HomeFragment.kt
@@ -1,5 +1,6 @@
package com.example.firstapp.ui.home
import android.content.Intent
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
@@ -10,6 +11,7 @@
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.example.firstapp.R
import com.example.firstapp.activity.PickupActivity
import com.example.firstapp.adapter.ExpressAdapter
import com.example.firstapp.core.Core
import com.example.firstapp.databinding.FragmentHomeBinding
@@ -50,14 +52,20 @@
    }
    private fun setupRecyclerViews() {
        // 快递列表
        //layoutManager = LinearLayoutManager(context):设置 RecyclerView 的布局管理器为线性布局管理器,表示列表是垂直排列的。
        //创建一个 ExpressAdapter 的实例,用于提供 RecyclerView 的数据。
        //将适配器设置给 RecyclerView,以便显示数据。
        binding.expressRecycler.apply {
            layoutManager = LinearLayoutManager(context)
            expressAdapter = ExpressAdapter()
            adapter = expressAdapter
            // 设置点击监听
            expressAdapter.setOnPackageClickListener { group, pack ->
                // 跳转到取件页面
                val intent = Intent(requireContext(), PickupActivity::class.java).apply {
                    putExtra("station_name", group.stationName)
                    putExtra("company", pack.company)
                }
                startActivity(intent)
            }
        }
//        // 财务列表
app/src/main/res/drawable/circle.png
app/src/main/res/drawable/circle_indicator.xml
对比新文件
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <solid android:color="#4CAF50"/>
    <size android:width="40dp"
        android:height="40dp"/>
</shape>
app/src/main/res/layout/activity_pickup.xml
对比新文件
@@ -0,0 +1,80 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/white">
    <!-- 顶部栏 -->
    <LinearLayout
        android:id="@+id/layout_top"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="16dp">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:gravity="center_vertical">
            <ImageView
                android:id="@+id/iv_back"
                android:layout_width="24dp"
                android:layout_height="24dp"
                android:src="@drawable/location"/>
            <TextView
                android:id="@+id/tv_station_name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="16dp"
                android:textSize="18sp"
                android:textColor="#333333"/>
            <TextView
                android:id="@+id/tv_package_count"
                android:layout_width="wrap_content"
                android:layout_height="24dp"
                android:layout_marginStart="8dp"
                android:textColor="#666666"
                android:textSize="14sp" />
        </LinearLayout>
    </LinearLayout>
    <!-- 包裹列表 -->
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rv_packages"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/layout_top"
        android:layout_above="@id/layout_bottom"
        android:padding="16dp"/>
    <!-- 底部取件区域 -->
    <LinearLayout
        android:id="@+id/layout_bottom"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="16dp"
        android:gravity="center"
        android:orientation="vertical"
        android:padding="16dp">
        <Button
            android:id="@+id/btn_pickup_all"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:backgroundTint="@color/black"
            android:text="全部取件"
            android:textColor="@android:color/white"
            android:textSize="18sp"
            android:padding="12dp"
            android:layout_marginTop="8dp"
            android:drawablePadding="8dp"
            />
    </LinearLayout>
</RelativeLayout>
app/src/main/res/layout/item_express_package_home.xml
对比新文件
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:padding="12dp"
    android:gravity="center_vertical">
    <TextView
        android:id="@+id/tv_package_info"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="16sp"
        android:textColor="#333333"/>
</LinearLayout>
app/src/main/res/layout/item_package.xml
对比新文件
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:padding="12dp"
    android:gravity="center_vertical">
    <ImageView
        android:id="@+id/iv_package_status"
        android:layout_width="12dp"
        android:layout_height="12dp"
        android:src="@drawable/circle"/>
    <TextView
        android:id="@+id/tv_package_info"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:textSize="16sp"
        android:textColor="#333333"/>
</LinearLayout>