| | |
| | | package com.xw.yunwei.ui.task.selectCar |
| | | |
| | | import android.content.Intent |
| | | import android.view.Gravity |
| | | import android.view.KeyEvent |
| | | import android.view.ViewGroup |
| | |
| | | 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) |
| | | } |
| | |
| | | |
| | | 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()) { |
| | |
| | | } |
| | | false |
| | | } |
| | | // 确认按钮:选中车辆后跳转创建任务 |
| | | binding.tvControl.setOnClickListener { |
| | | if (viewModel.selectCar == null) { |
| | | ToastUtilCommon.showWarn("请先选择一辆车辆") |
| | |
| | | |
| | | 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( |
| | |
| | | // 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, |
| | |
| | | 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, |
| | |
| | | "shape_blue1_bg_4" |
| | | ) |
| | | |
| | | // 区域点击监听:维护选中区域列表 |
| | | bind.stllArea.setListener { |
| | | val index = it.tag as Int // 当前点击的下标 |
| | | if (bind.stllArea.selectIndexList.contains(index)) { |
| | |
| | | bind.stllArea.onTvClick(index) |
| | | } |
| | | |
| | | // 运营状态点击监听:处理"全部"与其他状态的互斥逻辑 |
| | | bind.stllStatus.setListener { |
| | | val index = it.tag as Int // 当前点击的下标 |
| | | if (index == 0) { // 选择全部 取消其他 |
| | |
| | | } |
| | | |
| | | 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() |
| | | } |
| | | } |