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