From a69ed0d5eed84bea789463e718a2774122348685 Mon Sep 17 00:00:00 2001
From: cloudroam <cloudroam>
Date: 星期四, 27 二月 2025 17:55:22 +0800
Subject: [PATCH] add: 取件列表信息

---
 app/src/main/java/com/example/firstapp/activity/PickupActivity.kt |  117 ++++++++++++++++
 app/src/main/res/drawable/circle_indicator.xml                    |    7 +
 app/src/main/res/layout/item_package.xml                          |   23 +++
 app/src/main/java/com/example/firstapp/adapter/ExpressAdapter.kt  |  100 ++++++++++++-
 app/src/main/java/com/example/firstapp/ui/home/HomeFragment.kt    |   16 +
 app/src/main/res/drawable/circle.png                              |    0 
 app/src/main/AndroidManifest.xml                                  |    7 
 app/src/main/res/layout/activity_pickup.xml                       |   80 +++++++++++
 app/src/main/res/layout/item_express_package_home.xml             |   16 ++
 9 files changed, 348 insertions(+), 18 deletions(-)

diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index b329563..31faa7c 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/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>
 
diff --git a/app/src/main/java/com/example/firstapp/activity/PickupActivity.kt b/app/src/main/java/com/example/firstapp/activity/PickupActivity.kt
new file mode 100644
index 0000000..9713e2c
--- /dev/null
+++ b/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}个包裹"
+        }
+    }
+} 
\ No newline at end of file
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..dafbba4 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,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
+            )
         }
     }
 }
diff --git a/app/src/main/java/com/example/firstapp/ui/home/HomeFragment.kt b/app/src/main/java/com/example/firstapp/ui/home/HomeFragment.kt
index 5cdc5e0..4a96e85 100644
--- a/app/src/main/java/com/example/firstapp/ui/home/HomeFragment.kt
+++ b/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)
+            }
         }
 
 //        // 财务列表
diff --git a/app/src/main/res/drawable/circle.png b/app/src/main/res/drawable/circle.png
new file mode 100644
index 0000000..0f0c968
--- /dev/null
+++ b/app/src/main/res/drawable/circle.png
Binary files differ
diff --git a/app/src/main/res/drawable/circle_indicator.xml b/app/src/main/res/drawable/circle_indicator.xml
new file mode 100644
index 0000000..251bbe9
--- /dev/null
+++ b/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> 
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_pickup.xml b/app/src/main/res/layout/activity_pickup.xml
new file mode 100644
index 0000000..9685121
--- /dev/null
+++ b/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> 
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_express_package_home.xml b/app/src/main/res/layout/item_express_package_home.xml
new file mode 100644
index 0000000..f91a6a1
--- /dev/null
+++ b/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> 
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_package.xml b/app/src/main/res/layout/item_package.xml
new file mode 100644
index 0000000..6748f7b
--- /dev/null
+++ b/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> 
\ No newline at end of file

--
Gitblit v1.9.3