puzhibing
2026-08-21 5fa94b3718b4a78a4fcea4c97652b0ef20b7de3a
app/src/main/java/com/xw/yunwei/ui/task/selectCar/SelectCarActivity.kt
@@ -1,6 +1,5 @@
package com.xw.yunwei.ui.task.selectCar
import android.content.Intent
import android.view.Gravity
import android.view.KeyEvent
import android.view.ViewGroup
@@ -9,50 +8,96 @@
import androidx.core.os.bundleOf
import androidx.databinding.DataBindingUtil
import androidx.recyclerview.widget.LinearLayoutManager
import anet.channel.util.Utils.context
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.customview.customView
import com.afollestad.materialdialogs.customview.getCustomView
import com.xw.common.R
import com.xw.common.base.BaseActivity
import com.xw.common.base.OnItemClickListener
import com.xw.common.base.fastObserve
import com.xw.common.utils.BindUtils
import com.xw.common.utils.ToastUtilCommon
import com.xw.yunwei.BR
import com.xw.yunwei.BaseBusinessActivity
import com.xw.yunwei.databinding.ActivitySelectCarBinding
import com.xw.yunwei.databinding.DialogCarFilterBinding
import com.xw.yunwei.extension.colorIdToColorValue
import com.xw.yunwei.extension.dpToPx
import com.xw.yunwei.extension.drawableIdToDrawable
import com.xw.yunwei.model.CarModel
import com.xw.yunwei.model.FinishPage
import com.xw.yunwei.ui.task.create.CreateTaskActivity
import com.xw.yunwei.utils.DialogFactory
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
/**
 * 选择车辆
 * 选择车辆页面
 *
 * 展示可运营车辆列表,支持关键词搜索、区域与运营状态筛选,
 * 选中车辆后可跳转创建任务页面。
 * 通过 EventBus 接收 [FinishPage] 事件关闭当前页。
 */
class SelectCarActivity : BaseActivity<ActivitySelectCarBinding, SelectCarVM>(),
class SelectCarActivity : BaseBusinessActivity<ActivitySelectCarBinding, SelectCarVM>(),
    OnItemClickListener<CarModel> {
    override fun getBindingVariable() = BR.viewModel
    val adapter by lazy { SelectCarAdapter(this).apply { setHasStableIds(true) } }
    /** 空数据提示视图,懒加载创建 */
    val emptyView by lazy {
        BindUtils.getEmptyView2(this, "暂无符合条件的车辆")
    }
    /** 车辆列表适配器 */
    val adapter by lazy {
        SelectCarAdapter(this).apply {
            setHasStableIds(true)
            setEmptyView(emptyView)
        }
    }
    /** 筛选弹窗 */
    private var filterDialog: MaterialDialog? = null
    override fun init() {
        super.init()
        EventBus.getDefault().register(this)
        // 若外部传入已选车辆,则直接选中
        val selectCar = intent.getParcelableExtra<CarModel>("car")
        if (selectCar != null) {
            onItemClick(selectCar)
        }
        initAdapter()
        viewModel.refreshData()
        refreshFilterStatus()
    }
    //刷新筛选状态
    private fun refreshFilterStatus() {
        binding.filter.setTextColor(
            (if (viewModel.hadFilter()) R.color.blue_5 else R.color.gray_9).colorIdToColorValue(
                this
            )
        )
        binding.filter.setCompoundDrawables(
            null,
            null,
            (if (viewModel.hadFilter()) R.drawable.svg_filter2 else R.drawable.svg_filter).drawableIdToDrawable(
                this
            )?.apply {
                setBounds(
                    0, 0, 12.dpToPx(this@SelectCarActivity), 12.dpToPx(this@SelectCarActivity)
                )
            },
            null
        )
    }
    override fun setObservable() {
        super.setObservable()
        // 绑定刷新布局与 ViewModel 刷新状态
        viewModel.refreshLiveData.fastObserve(this, binding.refreshLayout)
        // 监听数据变化并刷新列表
        viewModel.dataList.observe(this) {
            adapter.setList(it)
        }
@@ -60,13 +105,16 @@
    override fun setListener() {
        with(binding.refreshLayout) {
            // 下拉刷新
            setOnRefreshListener {
                viewModel.refreshData()
            }
            // 上拉加载更多
            setOnLoadMoreListener {
                viewModel.loadMoreData()
            }
        }
        // 搜索框回车监听
        binding.searchEt.setOnKeyListener { _, keyCode, event ->
            if (keyCode == KeyEvent.KEYCODE_ENTER && event.action == KeyEvent.ACTION_UP) {
                if (viewModel.search.value.isNullOrEmpty()) {
@@ -77,6 +125,7 @@
            }
            false
        }
        // 确认按钮:选中车辆后跳转创建任务
        binding.tvControl.setOnClickListener {
            if (viewModel.selectCar == null) {
                ToastUtilCommon.showWarn("请先选择一辆车辆")
@@ -89,17 +138,24 @@
            startActivity(CreateTaskActivity::class.java, bundleOf("car" to viewModel.selectCar))
        }
        // 筛选按钮:先查询区域数据再展示弹窗
        binding.filter.setOnClickListener {
            viewModel.queryAreas { showFilterDialog() }
        }
    }
    /** 初始化 RecyclerView 适配器 */
    private fun initAdapter() {
        adapter.selectCar = viewModel.selectCar
        binding.rv.adapter = adapter
        binding.rv.layoutManager = LinearLayoutManager(this)
    }
    /**
     * 列表项点击事件,更新选中状态与底部按钮样式
     *
     * @param item 点击的车辆数据
     */
    override fun onItemClick(item: CarModel) {
        viewModel.selectCar = adapter.selectCar
        binding.tvControl.backgroundTintList = ContextCompat.getColorStateList(
@@ -114,9 +170,14 @@
//        super.onBackPressedHandel()
//    }
    /**
     * 显示车辆筛选弹窗
     *
     * 包含区域多选与运营状态单选/多选逻辑,支持"全部"互斥处理。
     */
    private fun showFilterDialog() {
        if (filterDialog == null) {
            filterDialog = MaterialDialog(this).apply {
            filterDialog = DialogFactory.produce(this).apply {
                customView(
                    com.xw.yunwei.R.layout.dialog_car_filter,
                    noVerticalPadding = true,
@@ -132,13 +193,15 @@
                    bind.stllArea.remove()
                    bind.stllStatus.remove()
                    // 初始化区域筛选数据
                    bind.stllArea.setData(
                        viewModel.filterAreas.map { it.electronicName?:"" },
                        viewModel.filterAreas.map { it.electronicName ?: "" },
                        this@SelectCarActivity,
                        ArrayList(),
                        this@SelectCarActivity.resources.getColor(R.color.blue_5),
                        "shape_blue1_bg_4"
                    )
                    // 初始化运营状态筛选数据
                    bind.stllStatus.setData(
                        viewModel.filterStatus,
                        this@SelectCarActivity,
@@ -147,6 +210,7 @@
                        "shape_blue1_bg_4"
                    )
                    // 区域点击监听:维护选中区域列表
                    bind.stllArea.setListener {
                        val index = it.tag as Int // 当前点击的下标
                        if (bind.stllArea.selectIndexList.contains(index)) {
@@ -157,6 +221,7 @@
                        bind.stllArea.onTvClick(index)
                    }
                    // 运营状态点击监听:处理"全部"与其他状态的互斥逻辑
                    bind.stllStatus.setListener {
                        val index = it.tag as Int // 当前点击的下标
                        if (index == 0) { // 选择全部 取消其他
@@ -183,9 +248,24 @@
                    }
                    bind.close.setOnClickListener { dismiss() }
                    bind.btnLeft.setOnClickListener { dismiss() }
                    bind.btnLeft.setOnClickListener {
                        val odlIndex = mutableListOf<Int>()
                        for (index in bind.stllArea.selectIndexList) { // 先取消选中状态
                            odlIndex.add(index)
                        }
                        odlIndex.forEach { bind.stllArea.onTvClick(it) }
                        viewModel.selectArea.clear()
                        odlIndex.clear()
                        for (index in bind.stllStatus.selectIndexList) { // 先取消选中状态
                            odlIndex.add(index)
                        }
                        odlIndex.forEach { bind.stllStatus.onTvClick(it) }
                        viewModel.selectStatus.clear()
                    }
                    bind.btnRight.setOnClickListener {
                        viewModel.refreshData()
                        refreshFilterStatus()
                        dismiss()
                    }
                }