From 1831c2a6304496729fc16af624c37e299beae83e Mon Sep 17 00:00:00 2001
From: cloudroam <cloudroam>
Date: 星期二, 01 四月 2025 11:36:19 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'
---
app/src/main/java/com/example/firstapp/ui/home/HomeFragment.kt | 320 +++++++++++++++++++++++++++++++++++++++++++---------
1 files changed, 262 insertions(+), 58 deletions(-)
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 ac27547..0841d30 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
@@ -9,17 +9,28 @@
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
+import android.widget.Toast
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
+import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
-import androidx.recyclerview.widget.RecyclerView
+import com.bumptech.glide.Glide
import com.example.firstapp.R
+import com.example.firstapp.activity.ContentDetailActivity
import com.example.firstapp.activity.PickupActivity
import com.example.firstapp.adapter.ExpressAdapter
import com.example.firstapp.adapter.FinanceAdapter
-import com.example.firstapp.core.Core
+import com.example.firstapp.adapter.CategorySelectorAdapter
+import com.example.firstapp.adapter.IncomeAdapter
+import com.example.firstapp.database.service.RetrofitClient
import com.example.firstapp.databinding.FragmentHomeBinding
+import com.example.firstapp.databinding.DialogCategorySelectorBinding
+import com.example.firstapp.model.IncomeGroup
+import com.example.firstapp.model.IncomePackage
+import com.example.firstapp.utils.PreferencesManager
+import com.google.android.material.bottomsheet.BottomSheetDialog
+import kotlinx.coroutines.launch
class HomeFragment : Fragment() {
@@ -32,7 +43,9 @@
private lateinit var homeViewModel: HomeViewModel
private lateinit var expressAdapter: ExpressAdapter
private lateinit var financeAdapter: FinanceAdapter
-// private lateinit var memorialAdapter: MemorialAdapter
+ private lateinit var incomeAdapter: IncomeAdapter
+ private lateinit var flightAdapter: FinanceAdapter
+ private lateinit var trainAdapter: FinanceAdapter
private lateinit var dataUpdateReceiver: BroadcastReceiver
//onCreateView这个方法创建后被调用,通常是初始化视图组件和观察者
@@ -48,14 +61,17 @@
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
- //通过 ViewModelProvider 获取 HomeViewModel 的实例,以便在视图中使用。
homeViewModel = ViewModelProvider(this).get(HomeViewModel::class.java)
+ // 假设从某处获取用户ID
+// val userId = getUserId() // 需要实现这个方法
+ val userId ="123456"
+ homeViewModel.initialize(requireContext(), userId)
- //调用这个方法来设置 RecyclerView用于设置 RecyclerView 的布局和适配器。
- setupRecyclerViews()
+ // 设置点击监听事件
+ setupAdapters()
setupTabSwitching()
- //调用这个方法来观察 ViewModel 中的数据变化
- observeViewModelData()
+ setupObservers()
+ setupCategorySelector()
}
override fun onCreate(savedInstanceState: Bundle?) {
@@ -72,7 +88,7 @@
}
}
- private fun setupRecyclerViews() {
+ private fun setupAdapters() {
binding.expressRecycler.apply {
layoutManager = LinearLayoutManager(context)
expressAdapter = ExpressAdapter()
@@ -84,6 +100,7 @@
val intent = Intent(requireContext(), PickupActivity::class.java).apply {
putExtra("station_name", group.stationName)
putExtra("company", pack.company)
+ putExtra("page_type", PickupActivity.TYPE_EXPRESS)
}
startActivity(intent)
}
@@ -96,7 +113,7 @@
adapter = financeAdapter
// 设置初始状态 - 添加这行
- binding.financeContent.visibility = View.GONE
+ binding.financeRecycler.visibility = View.GONE
// 设置点击监听
financeAdapter.setOnPackageClickListener { group, pack ->
@@ -104,17 +121,47 @@
val intent = Intent(requireContext(), PickupActivity::class.java).apply {
putExtra("station_name", group.stationName)
putExtra("company", pack.company)
+ putExtra("page_type", PickupActivity.TYPE_REPAYMENT)
+
}
startActivity(intent)
}
}
-//
-// // 纪念日列表
-// binding.memorialRecycler.apply {
-// layoutManager = LinearLayoutManager(context)
-// memorialAdapter = MemorialAdapter()
-// adapter = memorialAdapter
-// }
+
+ // 添加新的 RecyclerView
+ binding.incomeRecycler.apply {
+ layoutManager = LinearLayoutManager(context)
+ incomeAdapter = IncomeAdapter()
+ adapter = incomeAdapter
+
+ // 设置初始状态 - 添加这行
+ binding.incomeRecycler.visibility = View.GONE
+
+ // 设置点击监听
+ incomeAdapter.setOnPackageClickListener { group, pack ->
+ // 跳转到取件页面
+ val intent = Intent(requireContext(), PickupActivity::class.java).apply {
+ putExtra("station_name", group.stationName)
+ putExtra("company", pack.company)
+ putExtra("page_type", PickupActivity.TYPE_INCOME)
+ }
+ startActivity(intent)
+ }
+ }
+
+ binding.flightRecycler.apply {
+ layoutManager = LinearLayoutManager(context)
+ flightAdapter = FinanceAdapter()
+ adapter = flightAdapter
+ visibility = View.GONE
+ }
+
+ binding.trainRecycler.apply {
+ layoutManager = LinearLayoutManager(context)
+ trainAdapter = FinanceAdapter()
+ adapter = trainAdapter
+ visibility = View.GONE
+ }
}
private fun setupTabSwitching() {
@@ -122,51 +169,95 @@
// 设置初始状态
tabExpress.setTextColor(ContextCompat.getColor(requireContext(), R.color.tab_selected))
tabFinance.setTextColor(ContextCompat.getColor(requireContext(), R.color.gray))
- others.setTextColor(ContextCompat.getColor(requireContext(), R.color.gray))
-
- // 快递标签点击事件
+
+ // 快递标签点击事件 - 快递功能所有用户都可以使用
tabExpress.setOnClickListener {
- expressContent.visibility = View.VISIBLE
- financeContent.visibility = View.GONE
- tabExpress.setTextColor(ContextCompat.getColor(requireContext(), R.color.tab_selected))
- tabFinance.setTextColor(ContextCompat.getColor(requireContext(), R.color.gray))
- others.setTextColor(ContextCompat.getColor(requireContext(), R.color.gray))
- tabExpress.textSize = 16f
- tabFinance.textSize = 14f
- others.textSize = 14f
+ hideAllRecyclers()
+ expressRecycler.visibility = View.VISIBLE
+ updateTabStyles(tabExpress)
+ homeViewModel.loadExpressData()
}
- // 财务标签点击事件
- tabFinance.setOnClickListener {
- expressContent.visibility = View.GONE
- financeContent.visibility = View.VISIBLE
- tabExpress.setTextColor(ContextCompat.getColor(requireContext(), R.color.gray))
- tabFinance.setTextColor(ContextCompat.getColor(requireContext(), R.color.tab_selected))
- others.setTextColor(ContextCompat.getColor(requireContext(), R.color.gray))
- tabExpress.textSize = 14f
- tabFinance.textSize = 16f
- others.textSize = 14f
+ // 其他标签点击事件需要检查会员状态
+ val memberOnlyTabs = mapOf(
+ tabFinance to { homeViewModel.loadFinanceData() },
+ tabIncome to { homeViewModel.loadIncomeData() },
+ tabFlight to { homeViewModel.loadFlightData() },
+ tabTrain to { homeViewModel.loadTrainData() }
+ )
- // 在切换到财务标签时加载数据 - 添加这行
- homeViewModel.loadFinanceData()
- }
-
- // 其他标签点击事件
- others.setOnClickListener {
- expressContent.visibility = View.GONE
- financeContent.visibility = View.GONE
- tabExpress.setTextColor(ContextCompat.getColor(requireContext(), R.color.gray))
- tabFinance.setTextColor(ContextCompat.getColor(requireContext(), R.color.gray))
- others.setTextColor(ContextCompat.getColor(requireContext(), R.color.tab_selected))
- tabExpress.textSize = 14f
- tabFinance.textSize = 14f
- others.textSize = 16f
+ memberOnlyTabs.forEach { (tab, loadAction) ->
+ tab.setOnClickListener {
+ checkMembershipAndExecute(tab) {
+ hideAllRecyclers()
+ when (tab) {
+ tabFinance -> financeRecycler.visibility = View.VISIBLE
+ tabIncome -> incomeRecycler.visibility = View.VISIBLE
+ tabFlight -> flightRecycler.visibility = View.VISIBLE
+ tabTrain -> trainRecycler.visibility = View.VISIBLE
+ }
+ updateTabStyles(tab)
+ loadAction()
+ }
+ }
}
}
}
- //这个方法用于观察 homeViewModel 中的 expressItems 数据。
- private fun observeViewModelData() {
+ private fun checkMembershipAndExecute(tab: TextView, action: () -> Unit) {
+ // 从本地获取保存的手机号
+ val savedPhone = PreferencesManager.getPhone()
+ if (savedPhone.isNullOrEmpty()) {
+ Toast.makeText(requireContext(), "请先登录", Toast.LENGTH_SHORT).show()
+ return
+ }
+
+ // 使用协程检查会员状态
+ lifecycleScope.launch {
+ try {
+ val response = RetrofitClient.apiService.getUserInfo(savedPhone)
+ if (response.code == "0" && response.data != null) {
+ if (response.data.isMember) {
+ action()
+ } else {
+ Toast.makeText(requireContext(), "该功能仅对会员开放", Toast.LENGTH_SHORT).show()
+ // 切回快递标签
+ binding.tabExpress.performClick()
+ }
+ } else {
+ Toast.makeText(requireContext(), "获取用户信息失败", Toast.LENGTH_SHORT).show()
+ binding.tabExpress.performClick()
+ }
+ } catch (e: Exception) {
+ e.printStackTrace()
+ Toast.makeText(requireContext(), "网络错误,请稍后重试", Toast.LENGTH_SHORT).show()
+ binding.tabExpress.performClick()
+ }
+ }
+ }
+
+ private fun hideAllRecyclers() {
+ binding.apply {
+ expressRecycler.visibility = View.GONE
+ financeRecycler.visibility = View.GONE
+ incomeRecycler.visibility = View.GONE
+ flightRecycler.visibility = View.GONE
+ trainRecycler.visibility = View.GONE
+ }
+ }
+
+ private fun updateTabStyles(selectedTab: TextView) {
+ binding.apply {
+ val tabs = listOf(tabExpress, tabFinance, tabIncome, tabFlight, tabTrain)
+ tabs.forEach { tab ->
+ tab.setTextColor(ContextCompat.getColor(requireContext(),
+ if (tab == selectedTab) R.color.tab_selected else R.color.gray))
+ tab.textSize = if (tab == selectedTab) 16f else 14f
+ }
+ }
+ }
+
+ private fun setupObservers() {
//当 expressItems 数据发生变化时,更新 RecyclerView 的数据。
homeViewModel.expressItems.observe(viewLifecycleOwner) { items ->
//将新的数据列表提交给适配器,以更新 RecyclerView 的显示内容。
@@ -176,10 +267,57 @@
homeViewModel.financeItems.observe(viewLifecycleOwner) { items ->
financeAdapter.submitList(items)
}
-//
-// homeViewModel.memorialItems.observe(viewLifecycleOwner) { items ->
-// memorialAdapter.submitList(items)
-// }
+
+ // 观察收入数据变化
+ homeViewModel.incomeItems.observe(viewLifecycleOwner) { items ->
+ incomeAdapter.submitList(items)
+ }
+
+ homeViewModel.flightItems.observe(viewLifecycleOwner) { items ->
+ flightAdapter.submitList(items)
+ }
+
+ homeViewModel.trainItems.observe(viewLifecycleOwner) { items ->
+ trainAdapter.submitList(items)
+ }
+
+ // 观察可见分类的变化
+ homeViewModel.visibleCategories.observe(viewLifecycleOwner) { categories: List<String> ->
+ binding.apply {
+ // 隐藏所有标签
+ tabExpress.visibility = View.GONE
+ tabFinance.visibility = View.GONE
+ tabIncome.visibility = View.GONE
+ tabFlight.visibility = View.GONE
+ tabTrain.visibility = View.GONE
+
+ // 根据选中的分类显示对应的标签
+ categories.forEachIndexed { index: Int, categoryName: String ->
+ when (categoryName) {
+ "快递" -> {
+ tabExpress.visibility = View.VISIBLE
+ if (index == 0) tabExpress.performClick()
+ }
+ "还款" -> {
+ tabFinance.visibility = View.VISIBLE
+ if (index == 0) tabFinance.performClick()
+ }
+ "收入" -> {
+ tabIncome.visibility = View.VISIBLE
+ if (index == 0) tabIncome.performClick()
+ }
+ "航班" -> {
+ tabFlight.visibility = View.VISIBLE
+ if (index == 0) tabFlight.performClick()
+ }
+ "火车票" -> {
+ tabTrain.visibility = View.VISIBLE
+ if (index == 0) tabTrain.performClick()
+ }
+ }
+ }
+ }
+ }
}
override fun onResume() {
@@ -210,4 +348,70 @@
super.onDestroyView()
_binding = null
}
+
+ private fun loadAdvertisements() {
+ // 使用 Glide 加载网络图片
+ Glide.with(this)
+ .load("http://192.168.1.235:9999/advertisement/up.png")
+ .into(binding.adBanner)
+
+ Glide.with(this)
+ .load("http://192.168.1.235:9999/advertisement/down.png")
+ .into(binding.bottomAdBanner)
+ }
+
+ // 设置分类选择器 检查会员状态
+ private fun setupCategorySelector() {
+ binding.categoryButton.setOnClickListener {
+ // 从本地获取保存的手机号
+ val savedPhone = PreferencesManager.getPhone()
+ if (savedPhone.isNullOrEmpty()) {
+ Toast.makeText(requireContext(), "请先登录", Toast.LENGTH_SHORT).show()
+ return@setOnClickListener
+ }
+
+ // 使用协程检查会员状态
+ lifecycleScope.launch {
+ try {
+ val response = RetrofitClient.apiService.getUserInfo(savedPhone)
+ if (response.code == "0" && response.data != null) {
+ if (response.data.isMember) {
+ showCategorySelectorDialog()
+ } else {
+ Toast.makeText(requireContext(), "该功能仅对会员开放", Toast.LENGTH_SHORT).show()
+ }
+ } else {
+ Toast.makeText(requireContext(), "获取用户信息失败", Toast.LENGTH_SHORT).show()
+ }
+ } catch (e: Exception) {
+ e.printStackTrace()
+ Toast.makeText(requireContext(), "网络错误,请稍后重试", Toast.LENGTH_SHORT).show()
+ }
+ }
+ }
+ }
+
+ private fun showCategorySelectorDialog() {
+ val dialog = BottomSheetDialog(requireContext())
+ val dialogBinding = DialogCategorySelectorBinding.inflate(layoutInflater)
+ dialog.setContentView(dialogBinding.root)
+
+ val adapter = CategorySelectorAdapter()
+ dialogBinding.categoryRecyclerView.apply {
+ layoutManager = LinearLayoutManager(context)
+ this.adapter = adapter
+ }
+
+ // 加载现有分类
+ homeViewModel.categories.observe(viewLifecycleOwner) { categories ->
+ adapter.setCategories(categories)
+ }
+
+ dialogBinding.saveButton.setOnClickListener {
+ homeViewModel.saveCategories(adapter.getCategories())
+ dialog.dismiss()
+ }
+
+ dialog.show()
+ }
}
\ No newline at end of file
--
Gitblit v1.9.3