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