cloudroam
2025-03-31 a7820e2f1ee06a7b43b4d351cced3343d7e1a5e2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
package com.example.firstapp.ui.home
 
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.os.Bundle
import android.view.LayoutInflater
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.recyclerview.widget.LinearLayoutManager
import com.bumptech.glide.Glide
import com.example.firstapp.R
import com.example.firstapp.activity.PickupActivity
import com.example.firstapp.adapter.ExpressAdapter
import com.example.firstapp.adapter.FinanceAdapter
import com.example.firstapp.adapter.CategorySelectorAdapter
import com.example.firstapp.databinding.FragmentHomeBinding
import com.example.firstapp.databinding.DialogCategorySelectorBinding
import com.google.android.material.bottomsheet.BottomSheetDialog
 
class HomeFragment : Fragment() {
 
    private var _binding: FragmentHomeBinding? = null
 
    // This property is only valid between onCreateView and
    // onDestroyView.
    private val binding get() = _binding!!
 
    private lateinit var homeViewModel: HomeViewModel
    private lateinit var expressAdapter: ExpressAdapter
    private lateinit var financeAdapter: FinanceAdapter
    private lateinit var incomeAdapter: FinanceAdapter
    private lateinit var flightAdapter: FinanceAdapter
    private lateinit var trainAdapter: FinanceAdapter
    private lateinit var dataUpdateReceiver: BroadcastReceiver
 
    //onCreateView这个方法创建后被调用,通常是初始化视图组件和观察者
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        _binding = FragmentHomeBinding.inflate(inflater, container, false)
        return binding.root
    }
 
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
 
        homeViewModel = ViewModelProvider(this).get(HomeViewModel::class.java)
        // 假设从某处获取用户ID
//        val userId = getUserId() // 需要实现这个方法
        val userId ="123456"
        homeViewModel.initialize(requireContext(), userId)
        
        //调用这个方法来设置 RecyclerView用于设置 RecyclerView 的布局和适配器。
        setupRecyclerViews()
        setupTabSwitching()
        //调用这个方法来观察 ViewModel 中的数据变化
        observeViewModelData()
        setupCategorySelector()
    }
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
 
        // 创建广播接收器
        dataUpdateReceiver = object : BroadcastReceiver() {
            override fun onReceive(context: Context, intent: Intent) {
                if (intent.action == "com.example.firstapp.DATA_UPDATED") {
                    // 收到数据更新广播时重新加载数据
                    homeViewModel.loadExpressData()
                }
            }
        }
    }
 
    private fun setupRecyclerViews() {
        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)
            }
        }
 
        // 财务列表
        binding.financeRecycler.apply {
            layoutManager = LinearLayoutManager(context)
            financeAdapter = FinanceAdapter()
            adapter = financeAdapter
 
            // 设置初始状态 - 添加这行
            binding.financeRecycler.visibility = View.GONE
 
            // 设置点击监听
            financeAdapter.setOnPackageClickListener { group, pack ->
                // 跳转到取件页面
                val intent = Intent(requireContext(), PickupActivity::class.java).apply {
                    putExtra("station_name", group.stationName)
                    putExtra("company", pack.company)
                }
                startActivity(intent)
            }
        }
 
        // 添加新的 RecyclerView
        binding.incomeRecycler.apply {
            layoutManager = LinearLayoutManager(context)
            incomeAdapter = FinanceAdapter()
            adapter = incomeAdapter
            visibility = View.GONE
        }
 
        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() {
        binding.apply {
            // 设置初始状态
            tabExpress.setTextColor(ContextCompat.getColor(requireContext(), R.color.tab_selected))
            tabFinance.setTextColor(ContextCompat.getColor(requireContext(), R.color.gray))
 
            // 快递标签点击事件
            tabExpress.setOnClickListener {
                hideAllRecyclers()
                expressRecycler.visibility = View.VISIBLE
                updateTabStyles(tabExpress)
                homeViewModel.loadExpressData()
            }
            
            // 财务标签点击事件
            tabFinance.setOnClickListener {
                hideAllRecyclers()
                financeRecycler.visibility = View.VISIBLE
                updateTabStyles(tabFinance)
                homeViewModel.loadFinanceData()
            }
 
            tabIncome.setOnClickListener {
                hideAllRecyclers()
                incomeRecycler.visibility = View.VISIBLE
                updateTabStyles(tabIncome)
                homeViewModel.loadIncomeData()
            }
 
            tabFlight.setOnClickListener {
                hideAllRecyclers()
                flightRecycler.visibility = View.VISIBLE
                updateTabStyles(tabFlight)
                homeViewModel.loadFlightData()
            }
 
            tabTrain.setOnClickListener {
                hideAllRecyclers()
                trainRecycler.visibility = View.VISIBLE
                updateTabStyles(tabTrain)
                homeViewModel.loadTrainData()
            }
        }
    }
 
    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
            }
        }
    }
 
    //这个方法用于观察 homeViewModel 中的 expressItems 数据。
    private fun observeViewModelData() {
        //当 expressItems 数据发生变化时,更新 RecyclerView 的数据。
        homeViewModel.expressItems.observe(viewLifecycleOwner) { items ->
            //将新的数据列表提交给适配器,以更新 RecyclerView 的显示内容。
            expressAdapter.submitList(items)
        }
 
        homeViewModel.financeItems.observe(viewLifecycleOwner) { items ->
            financeAdapter.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() {
        super.onResume()
        // 使用 ContextCompat 注册广播接收器,并指定 RECEIVER_NOT_EXPORTED 标志
        ContextCompat.registerReceiver(
            requireContext(),
            dataUpdateReceiver,
            IntentFilter("com.example.firstapp.DATA_UPDATED"),
            ContextCompat.RECEIVER_NOT_EXPORTED
        )
        // 加载数据
        homeViewModel.loadExpressData()
    }
 
    override fun onPause() {
        super.onPause()
        try {
            // 取消注册广播接收器
            requireContext().unregisterReceiver(dataUpdateReceiver)
        } catch (e: Exception) {
            // 处理可能的异常
            e.printStackTrace()
        }
    }
 
    override fun onDestroyView() {
        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 {
            // TODO: 检查会员状态
            if (true) { // 临时设置为true,实际应该检查会员状态
                showCategorySelectorDialog()
            } else {
                // 显示会员提示
                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()
    }
}