| | |
| | | |
| | | import android.annotation.SuppressLint |
| | | import android.net.Uri |
| | | import android.os.Bundle |
| | | import android.view.Gravity |
| | | import android.view.ViewGroup |
| | | import android.view.WindowManager |
| | | import androidx.core.os.bundleOf |
| | | import androidx.databinding.DataBindingUtil |
| | | import androidx.recyclerview.widget.GridLayoutManager |
| | | import androidx.recyclerview.widget.LinearLayoutManager |
| | | import com.afollestad.materialdialogs.MaterialDialog |
| | | import com.afollestad.materialdialogs.customview.customView |
| | | import com.afollestad.materialdialogs.customview.getCustomView |
| | | import com.blankj.utilcode.util.UriUtils |
| | | import com.luck.picture.lib.config.PictureMimeType |
| | | import com.luck.picture.lib.entity.LocalMedia |
| | |
| | | import com.xw.common.base.ImageEventListener |
| | | import com.xw.common.base.ImageSelectAdapter |
| | | import com.xw.common.base.ShowImgListDialog |
| | | import com.xw.common.utils.ToastUtilCommon |
| | | import com.xw.yunwei.BR |
| | | import com.xw.yunwei.BaseBusinessActivity |
| | | import com.xw.yunwei.constants.Key |
| | | import com.xw.yunwei.databinding.ActivityAccidentProcessBinding |
| | | import com.xw.yunwei.databinding.DialogAccidentFilterBinding |
| | | import com.xw.yunwei.model.TaskAccidentModel |
| | | import com.xw.yunwei.ui.task.create.LeftCategoryAdapter |
| | | import com.xw.yunwei.ui.task.create.RightItemAdapter |
| | | import com.xw.yunwei.utils.DialogFactory |
| | | import com.xw.yunwei.utils.PictureSelectorFactory |
| | | |
| | | /** |
| | |
| | | * |
| | | * 图片支持拍照和从图库选择两种方式,提交时先上传图片再调用接口。 |
| | | */ |
| | | class AccidentProcessActivity : BaseBusinessActivity<ActivityAccidentProcessBinding, AccidentProcessVM>(){ |
| | | class AccidentProcessActivity : |
| | | BaseBusinessActivity<ActivityAccidentProcessBinding, AccidentProcessVM>() { |
| | | /** 事故类型筛选弹窗 */ |
| | | private var filterDialog: MaterialDialog? = null |
| | | |
| | | /** 左侧事故大类 Adapter */ |
| | | private lateinit var leftAdapter: LeftCategoryAdapter |
| | | |
| | | /** 右侧事故子类 Adapter */ |
| | | private lateinit var rightAdapter: RightItemAdapter |
| | | |
| | | companion object { |
| | | //获取跳转该页面参数 |
| | | fun getParams(model: TaskAccidentModel?): Bundle { |
| | | return bundleOf( |
| | | Key.ID to model?.id, |
| | | Key.DATA to model?.taskTypeId |
| | | ) |
| | | } |
| | | } |
| | | |
| | | override fun getBindingVariable() = BR.viewModel |
| | | |
| | | override fun init() { |
| | | super.init() |
| | | // 从Intent获取任务ID并保存到ViewModel |
| | | viewModel.taskId = intent.getLongExtra("taskId", 0L) |
| | | viewModel.taskId = intent.getLongExtra(Key.ID, 0L) |
| | | viewModel.taskTypeId = intent.getStringExtra(Key.DATA) |
| | | initAdapter() |
| | | // 移除默认选中状态,由用户手动选择责任判定 |
| | | binding.stllZrpd.remove() |
| | |
| | | resources.getColor(R.color.white), |
| | | "shape_blue_5_bg_4" |
| | | ) |
| | | viewModel.getTypeList{ |
| | | binding.tvAccidentFilter.text = |
| | | if (viewModel.getSelectType().isEmpty()) "" else "选好了" |
| | | } |
| | | } |
| | | |
| | | override fun setListener() { |
| | | super.setListener() |
| | | // 点击事故类型筛选按钮,先拉取类型列表再弹窗 |
| | | binding.tvAccidentFilter.setOnClickListener { |
| | | viewModel.getTypeList { |
| | | showFilterDialog() |
| | | } |
| | | } |
| | | // 责任判定标签点击监听:单选逻辑,先取消全部选中,再选中当前点击项 |
| | | binding.stllZrpd.setListener { |
| | | for (index in binding.stllZrpd.selectIndexList) { // 先取消选中状态 |
| | |
| | | * 分别绑定到 rv1(交警判责照片)、rv2(现场情况照片)、rv3(处置情况照片), |
| | | * 每组最多上传 [AccidentProcessVM.maxSizes] 张图片。 |
| | | */ |
| | | private fun initAdapter(){ |
| | | private fun initAdapter() { |
| | | viewModel.adapters.clear() |
| | | viewModel.imageEvents.clear() |
| | | for (index in 0 until 3) { |
| | |
| | | */ |
| | | // 拍照 |
| | | private fun takeAPhotograph() { |
| | | PictureSelectorFactory.takeAPhotograph(this,resultCallbackListener) |
| | | PictureSelectorFactory.takeAPhotograph(this, resultCallbackListener) |
| | | } |
| | | |
| | | /** |
| | |
| | | dataList.addAll(viewModel.adapters[viewModel.operateIndex].data) |
| | | for (item in selectList) { |
| | | val path: String = item.availablePath |
| | | var imgPath = if (PictureMimeType.isContent(path) && !item.isCut && !item.isCompressed) { |
| | | UriUtils.uri2File(Uri.parse(path)).absolutePath |
| | | } else { |
| | | path |
| | | } |
| | | var imgPath = |
| | | if (PictureMimeType.isContent(path) && !item.isCut && !item.isCompressed) { |
| | | UriUtils.uri2File(Uri.parse(path)).absolutePath |
| | | } else { |
| | | path |
| | | } |
| | | dataList.add(FileSelectBean(localPath = imgPath, type = "img")) |
| | | } |
| | | viewModel.adapters[viewModel.operateIndex].setList(dataList) |
| | | } |
| | | } |
| | | |
| | | override fun onCancel() {} |
| | | } |
| | | |
| | | /** |
| | | * 显示事故类型筛选弹窗(底部 BottomSheet 样式) |
| | | * |
| | | * 左侧显示事故大类,右侧显示对应子类,支持多选。 |
| | | * 弹窗 dismiss 时更新筛选按钮文案。 |
| | | */ |
| | | private fun showFilterDialog() { |
| | | if (filterDialog == null) { |
| | | filterDialog = DialogFactory.produce(this).apply { |
| | | customView( |
| | | com.xw.yunwei.R.layout.dialog_accident_filter, |
| | | noVerticalPadding = true, |
| | | horizontalPadding = false |
| | | ) |
| | | cancelable(true) |
| | | cornerRadius(12f) |
| | | val bind: DialogAccidentFilterBinding? = DataBindingUtil.bind(getCustomView()) |
| | | bind?.let { |
| | | setupRecyclerViews(it) |
| | | // 取消按钮:清空所有选中状态并重置到第一项 |
| | | it.cancel.setOnClickListener { |
| | | viewModel.categories.forEach { |
| | | it.items.forEach { |
| | | it.isSelected = false |
| | | } |
| | | } |
| | | leftAdapter.selectedPosition = 0 |
| | | rightAdapter.updateData(viewModel.categories[0].items) |
| | | dismiss() |
| | | } |
| | | // 左侧按钮:仅重置选中状态,不关闭弹窗 |
| | | it.btnLeft.setOnClickListener { |
| | | viewModel.categories.forEach { |
| | | it.items.forEach { |
| | | it.isSelected = false |
| | | } |
| | | } |
| | | leftAdapter.selectedPosition = 0 |
| | | rightAdapter.updateData(viewModel.categories[0].items) |
| | | |
| | | } |
| | | // 右侧按钮:确认选择并关闭弹窗 |
| | | it.btnRight.setOnClickListener { |
| | | if (viewModel.getSelectType().isEmpty()) { |
| | | ToastUtilCommon.showWarn("还未选择事故类型") |
| | | return@setOnClickListener |
| | | } |
| | | dismiss() |
| | | } |
| | | // 确定按钮:确认选择并关闭弹窗 |
| | | it.sure.setOnClickListener { |
| | | if (viewModel.getSelectType().isEmpty()) { |
| | | ToastUtilCommon.showWarn("还未选择事故类型") |
| | | return@setOnClickListener |
| | | } |
| | | dismiss() |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 弹窗关闭时更新筛选按钮文案(已选则显示"选好了") |
| | | filterDialog!!.setOnDismissListener { |
| | | binding.tvAccidentFilter.text = |
| | | if (viewModel.getSelectType().isEmpty()) "" else "选好了" |
| | | } |
| | | } |
| | | |
| | | filterDialog?.show() |
| | | // 关键:让软键盘把 BottomSheet 顶上去 |
| | | filterDialog?.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE) |
| | | filterDialog?.window?.setLayout( |
| | | ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT |
| | | ) |
| | | filterDialog?.window?.setGravity(Gravity.BOTTOM) |
| | | filterDialog?.window?.setWindowAnimations(R.style.AnimUp) |
| | | } |
| | | |
| | | /** |
| | | * 初始化事故类型筛选弹窗中的左右 RecyclerView |
| | | * |
| | | * @param bind 弹窗视图绑定对象 |
| | | */ |
| | | private fun setupRecyclerViews(bind: DialogAccidentFilterBinding) { |
| | | bind.leftRecyclerView.layoutManager = LinearLayoutManager(this) |
| | | leftAdapter = LeftCategoryAdapter(viewModel.categories) { category, position -> |
| | | rightAdapter.updateData(category.items) |
| | | } |
| | | bind.leftRecyclerView.adapter = leftAdapter |
| | | |
| | | bind.rightRecyclerView.layoutManager = LinearLayoutManager(this) |
| | | rightAdapter = RightItemAdapter(viewModel.categories[0].items) |
| | | bind.rightRecyclerView.adapter = rightAdapter |
| | | } |
| | | } |