diff --git a/app/build.gradle b/app/build.gradle index b325802..a0beed6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -59,7 +59,7 @@ dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') //基础依赖库 - implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.3' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.4' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.9.0' //Google官方授权框架 diff --git a/app/build.gradle b/app/build.gradle index b325802..a0beed6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -59,7 +59,7 @@ dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') //基础依赖库 - implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.3' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.4' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.9.0' //Google官方授权框架 diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt index 8176a68..30a8241 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -95,6 +96,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/build.gradle b/app/build.gradle index b325802..a0beed6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -59,7 +59,7 @@ dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') //基础依赖库 - implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.3' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.4' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.9.0' //Google官方授权框架 diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt index 8176a68..30a8241 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -95,6 +96,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt index 36abfdf..dedd479 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -88,6 +89,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/build.gradle b/app/build.gradle index b325802..a0beed6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -59,7 +59,7 @@ dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') //基础依赖库 - implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.3' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.4' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.9.0' //Google官方授权框架 diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt index 8176a68..30a8241 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -95,6 +96,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt index 36abfdf..dedd479 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -88,6 +89,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt index e41c337..7f9edba 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -82,6 +83,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/build.gradle b/app/build.gradle index b325802..a0beed6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -59,7 +59,7 @@ dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') //基础依赖库 - implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.3' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.4' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.9.0' //Google官方授权框架 diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt index 8176a68..30a8241 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -95,6 +96,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt index 36abfdf..dedd479 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -88,6 +89,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt index e41c337..7f9edba 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -82,6 +83,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt new file mode 100644 index 0000000..c26e90c --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.smart.town.sanxi.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index b325802..a0beed6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -59,7 +59,7 @@ dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') //基础依赖库 - implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.3' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.4' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.9.0' //Google官方授权框架 diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt index 8176a68..30a8241 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -95,6 +96,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt index 36abfdf..dedd479 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -88,6 +89,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt index e41c337..7f9edba 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -82,6 +83,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt new file mode 100644 index 0000000..c26e90c --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.smart.town.sanxi.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt index 8fd3296..a295ff6 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt @@ -2,32 +2,41 @@ import android.app.ProgressDialog import android.content.Intent +import android.graphics.Color import android.net.Uri import android.os.Build import android.os.CountDownTimer import android.widget.LinearLayout import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.smart.town.sanxi.BuildConfig import com.casic.smart.town.sanxi.R import com.casic.smart.town.sanxi.extensions.appendDownloadUrl +import com.casic.smart.town.sanxi.extensions.combineImagePath +import com.casic.smart.town.sanxi.extensions.compressImage +import com.casic.smart.town.sanxi.extensions.reformat import com.casic.smart.town.sanxi.model.UserDetailModel -import com.casic.smart.town.sanxi.util.AuthenticationHelper -import com.casic.smart.town.sanxi.util.LoadingDialogHub -import com.casic.smart.town.sanxi.util.LocaleConstant +import com.casic.smart.town.sanxi.util.* import com.casic.smart.town.sanxi.view.AboutUsActivity import com.casic.smart.town.sanxi.view.ChangePasswordActivity import com.casic.smart.town.sanxi.view.LoginActivity import com.casic.smart.town.sanxi.view.UpdateDataActivity +import com.casic.smart.town.sanxi.vm.UploadImageViewModel import com.casic.smart.town.sanxi.vm.UserViewModel import com.casic.smart.town.sanxi.vm.VersionViewModel +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.callback.OnDownloadListener import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.fragment_more.* import java.io.File @@ -37,13 +46,14 @@ private lateinit var user: UserDetailModel.DataModel private lateinit var userViewModel: UserViewModel private lateinit var versionViewModel: VersionViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var progressDialog: ProgressDialog override fun initLayoutView(): Int = R.layout.fragment_more override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() @@ -65,6 +75,12 @@ PageNavigationManager.finishAllActivity() } } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + //TODO 更新头像无权限,要改 + "头像更新成功".show(requireContext()) + } + } versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java] versionViewModel.versionResultModel.observe(this) { @@ -90,6 +106,29 @@ } } + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.resultModel.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + user.roleIds.reformat(), + it.data, + "", + "", + "" + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userImageView) + } + } + //初始化下载对话框 progressDialog = ProgressDialog(requireContext()) progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) @@ -105,11 +144,63 @@ else -> LoadingDialogHub.dismiss() } } + + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "图片上传中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { userImageView.setOnClickListener { - "待完善".show(requireContext()) + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(requireContext()) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(requireContext()) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.get) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() } updateUserButton.setOnClickListener { @@ -195,6 +286,20 @@ userDeptView.text = String.format("部门:${user.deptName}") } + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + private fun downloadApk(url: String?) { progressDialog.setMessage("下载新版本中...") progressDialog.show() diff --git a/app/build.gradle b/app/build.gradle index b325802..a0beed6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -59,7 +59,7 @@ dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') //基础依赖库 - implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.3' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.4' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.9.0' //Google官方授权框架 diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt index 8176a68..30a8241 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -95,6 +96,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt index 36abfdf..dedd479 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -88,6 +89,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt index e41c337..7f9edba 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -82,6 +83,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt new file mode 100644 index 0000000..c26e90c --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.smart.town.sanxi.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt index 8fd3296..a295ff6 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt @@ -2,32 +2,41 @@ import android.app.ProgressDialog import android.content.Intent +import android.graphics.Color import android.net.Uri import android.os.Build import android.os.CountDownTimer import android.widget.LinearLayout import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.smart.town.sanxi.BuildConfig import com.casic.smart.town.sanxi.R import com.casic.smart.town.sanxi.extensions.appendDownloadUrl +import com.casic.smart.town.sanxi.extensions.combineImagePath +import com.casic.smart.town.sanxi.extensions.compressImage +import com.casic.smart.town.sanxi.extensions.reformat import com.casic.smart.town.sanxi.model.UserDetailModel -import com.casic.smart.town.sanxi.util.AuthenticationHelper -import com.casic.smart.town.sanxi.util.LoadingDialogHub -import com.casic.smart.town.sanxi.util.LocaleConstant +import com.casic.smart.town.sanxi.util.* import com.casic.smart.town.sanxi.view.AboutUsActivity import com.casic.smart.town.sanxi.view.ChangePasswordActivity import com.casic.smart.town.sanxi.view.LoginActivity import com.casic.smart.town.sanxi.view.UpdateDataActivity +import com.casic.smart.town.sanxi.vm.UploadImageViewModel import com.casic.smart.town.sanxi.vm.UserViewModel import com.casic.smart.town.sanxi.vm.VersionViewModel +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.callback.OnDownloadListener import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.fragment_more.* import java.io.File @@ -37,13 +46,14 @@ private lateinit var user: UserDetailModel.DataModel private lateinit var userViewModel: UserViewModel private lateinit var versionViewModel: VersionViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var progressDialog: ProgressDialog override fun initLayoutView(): Int = R.layout.fragment_more override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() @@ -65,6 +75,12 @@ PageNavigationManager.finishAllActivity() } } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + //TODO 更新头像无权限,要改 + "头像更新成功".show(requireContext()) + } + } versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java] versionViewModel.versionResultModel.observe(this) { @@ -90,6 +106,29 @@ } } + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.resultModel.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + user.roleIds.reformat(), + it.data, + "", + "", + "" + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userImageView) + } + } + //初始化下载对话框 progressDialog = ProgressDialog(requireContext()) progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) @@ -105,11 +144,63 @@ else -> LoadingDialogHub.dismiss() } } + + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "图片上传中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { userImageView.setOnClickListener { - "待完善".show(requireContext()) + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(requireContext()) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(requireContext()) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.get) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() } updateUserButton.setOnClickListener { @@ -195,6 +286,20 @@ userDeptView.text = String.format("部门:${user.deptName}") } + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + private fun downloadApk(url: String?) { progressDialog.setMessage("下载新版本中...") progressDialog.show() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt index bb6a7d8..95bbfd0 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt @@ -10,7 +10,7 @@ import com.casic.smart.town.sanxi.fragment.order.NotProcessedFragment import com.casic.smart.town.sanxi.util.LocaleConstant import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.pengxh.kt.lite.extensions.getStatusBarHeight import kotlinx.android.synthetic.main.fragment_order.* class OrderPageFragment : KotlinBaseFragment() { @@ -28,7 +28,7 @@ override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() diff --git a/app/build.gradle b/app/build.gradle index b325802..a0beed6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -59,7 +59,7 @@ dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') //基础依赖库 - implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.3' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.4' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.9.0' //Google官方授权框架 diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt index 8176a68..30a8241 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -95,6 +96,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt index 36abfdf..dedd479 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -88,6 +89,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt index e41c337..7f9edba 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -82,6 +83,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt new file mode 100644 index 0000000..c26e90c --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.smart.town.sanxi.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt index 8fd3296..a295ff6 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt @@ -2,32 +2,41 @@ import android.app.ProgressDialog import android.content.Intent +import android.graphics.Color import android.net.Uri import android.os.Build import android.os.CountDownTimer import android.widget.LinearLayout import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.smart.town.sanxi.BuildConfig import com.casic.smart.town.sanxi.R import com.casic.smart.town.sanxi.extensions.appendDownloadUrl +import com.casic.smart.town.sanxi.extensions.combineImagePath +import com.casic.smart.town.sanxi.extensions.compressImage +import com.casic.smart.town.sanxi.extensions.reformat import com.casic.smart.town.sanxi.model.UserDetailModel -import com.casic.smart.town.sanxi.util.AuthenticationHelper -import com.casic.smart.town.sanxi.util.LoadingDialogHub -import com.casic.smart.town.sanxi.util.LocaleConstant +import com.casic.smart.town.sanxi.util.* import com.casic.smart.town.sanxi.view.AboutUsActivity import com.casic.smart.town.sanxi.view.ChangePasswordActivity import com.casic.smart.town.sanxi.view.LoginActivity import com.casic.smart.town.sanxi.view.UpdateDataActivity +import com.casic.smart.town.sanxi.vm.UploadImageViewModel import com.casic.smart.town.sanxi.vm.UserViewModel import com.casic.smart.town.sanxi.vm.VersionViewModel +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.callback.OnDownloadListener import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.fragment_more.* import java.io.File @@ -37,13 +46,14 @@ private lateinit var user: UserDetailModel.DataModel private lateinit var userViewModel: UserViewModel private lateinit var versionViewModel: VersionViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var progressDialog: ProgressDialog override fun initLayoutView(): Int = R.layout.fragment_more override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() @@ -65,6 +75,12 @@ PageNavigationManager.finishAllActivity() } } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + //TODO 更新头像无权限,要改 + "头像更新成功".show(requireContext()) + } + } versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java] versionViewModel.versionResultModel.observe(this) { @@ -90,6 +106,29 @@ } } + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.resultModel.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + user.roleIds.reformat(), + it.data, + "", + "", + "" + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userImageView) + } + } + //初始化下载对话框 progressDialog = ProgressDialog(requireContext()) progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) @@ -105,11 +144,63 @@ else -> LoadingDialogHub.dismiss() } } + + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "图片上传中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { userImageView.setOnClickListener { - "待完善".show(requireContext()) + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(requireContext()) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(requireContext()) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.get) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() } updateUserButton.setOnClickListener { @@ -195,6 +286,20 @@ userDeptView.text = String.format("部门:${user.deptName}") } + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + private fun downloadApk(url: String?) { progressDialog.setMessage("下载新版本中...") progressDialog.show() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt index bb6a7d8..95bbfd0 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt @@ -10,7 +10,7 @@ import com.casic.smart.town.sanxi.fragment.order.NotProcessedFragment import com.casic.smart.town.sanxi.util.LocaleConstant import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.pengxh.kt.lite.extensions.getStatusBarHeight import kotlinx.android.synthetic.main.fragment_order.* class OrderPageFragment : KotlinBaseFragment() { @@ -28,7 +28,7 @@ override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt index 23648cb..b0dcc9e 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt @@ -20,12 +20,8 @@ import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToCompleteDate -import com.pengxh.kt.lite.extensions.timestampToLastWeekDate -import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_statistics.* class StatisticsPageFragment : KotlinBaseFragment() { @@ -43,7 +39,7 @@ override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() diff --git a/app/build.gradle b/app/build.gradle index b325802..a0beed6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -59,7 +59,7 @@ dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') //基础依赖库 - implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.3' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.4' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.9.0' //Google官方授权框架 diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt index 8176a68..30a8241 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -95,6 +96,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt index 36abfdf..dedd479 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -88,6 +89,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt index e41c337..7f9edba 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -82,6 +83,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt new file mode 100644 index 0000000..c26e90c --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.smart.town.sanxi.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt index 8fd3296..a295ff6 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt @@ -2,32 +2,41 @@ import android.app.ProgressDialog import android.content.Intent +import android.graphics.Color import android.net.Uri import android.os.Build import android.os.CountDownTimer import android.widget.LinearLayout import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.smart.town.sanxi.BuildConfig import com.casic.smart.town.sanxi.R import com.casic.smart.town.sanxi.extensions.appendDownloadUrl +import com.casic.smart.town.sanxi.extensions.combineImagePath +import com.casic.smart.town.sanxi.extensions.compressImage +import com.casic.smart.town.sanxi.extensions.reformat import com.casic.smart.town.sanxi.model.UserDetailModel -import com.casic.smart.town.sanxi.util.AuthenticationHelper -import com.casic.smart.town.sanxi.util.LoadingDialogHub -import com.casic.smart.town.sanxi.util.LocaleConstant +import com.casic.smart.town.sanxi.util.* import com.casic.smart.town.sanxi.view.AboutUsActivity import com.casic.smart.town.sanxi.view.ChangePasswordActivity import com.casic.smart.town.sanxi.view.LoginActivity import com.casic.smart.town.sanxi.view.UpdateDataActivity +import com.casic.smart.town.sanxi.vm.UploadImageViewModel import com.casic.smart.town.sanxi.vm.UserViewModel import com.casic.smart.town.sanxi.vm.VersionViewModel +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.callback.OnDownloadListener import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.fragment_more.* import java.io.File @@ -37,13 +46,14 @@ private lateinit var user: UserDetailModel.DataModel private lateinit var userViewModel: UserViewModel private lateinit var versionViewModel: VersionViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var progressDialog: ProgressDialog override fun initLayoutView(): Int = R.layout.fragment_more override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() @@ -65,6 +75,12 @@ PageNavigationManager.finishAllActivity() } } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + //TODO 更新头像无权限,要改 + "头像更新成功".show(requireContext()) + } + } versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java] versionViewModel.versionResultModel.observe(this) { @@ -90,6 +106,29 @@ } } + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.resultModel.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + user.roleIds.reformat(), + it.data, + "", + "", + "" + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userImageView) + } + } + //初始化下载对话框 progressDialog = ProgressDialog(requireContext()) progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) @@ -105,11 +144,63 @@ else -> LoadingDialogHub.dismiss() } } + + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "图片上传中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { userImageView.setOnClickListener { - "待完善".show(requireContext()) + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(requireContext()) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(requireContext()) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.get) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() } updateUserButton.setOnClickListener { @@ -195,6 +286,20 @@ userDeptView.text = String.format("部门:${user.deptName}") } + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + private fun downloadApk(url: String?) { progressDialog.setMessage("下载新版本中...") progressDialog.show() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt index bb6a7d8..95bbfd0 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt @@ -10,7 +10,7 @@ import com.casic.smart.town.sanxi.fragment.order.NotProcessedFragment import com.casic.smart.town.sanxi.util.LocaleConstant import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.pengxh.kt.lite.extensions.getStatusBarHeight import kotlinx.android.synthetic.main.fragment_order.* class OrderPageFragment : KotlinBaseFragment() { @@ -28,7 +28,7 @@ override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt index 23648cb..b0dcc9e 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt @@ -20,12 +20,8 @@ import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToCompleteDate -import com.pengxh.kt.lite.extensions.timestampToLastWeekDate -import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_statistics.* class StatisticsPageFragment : KotlinBaseFragment() { @@ -43,7 +39,7 @@ override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt index 2ef87f8..bec4c35 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt @@ -9,6 +9,8 @@ import com.casic.smart.town.sanxi.view.order.CompletedDetailActivity import com.casic.smart.town.sanxi.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -43,8 +45,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + completedAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -52,17 +53,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + completedAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111001) } } - weakReferenceHandler.sendEmptyMessage(2022111001) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -91,30 +96,26 @@ private val callback = Handler.Callback { if (it.what == 2022111001) { - if (isRefresh || isLoadMore) { - completedAdapter.notifyDataSetChanged() - } else { - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("您还没有处理完成过任何工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - completedAdapter = OrderCompletedAdapter(requireContext(), dataBeans) - orderRecyclerView!!.adapter = completedAdapter - completedAdapter.setOnItemClickListener(object : - OrderCompletedAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) + if (dataBeans.size == 0) { + emptyView.showEmptyPage("您还没有处理完成过任何工单") { + pageIndex = 1 + obtainWorkOrderList() } + } else { + emptyView.hide() + completedAdapter = OrderCompletedAdapter(requireContext(), dataBeans) + orderRecyclerView.adapter = completedAdapter + completedAdapter.setOnItemClickListener(object : + OrderCompletedAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/build.gradle b/app/build.gradle index b325802..a0beed6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -59,7 +59,7 @@ dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') //基础依赖库 - implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.3' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.4' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.9.0' //Google官方授权框架 diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt index 8176a68..30a8241 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -95,6 +96,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt index 36abfdf..dedd479 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -88,6 +89,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt index e41c337..7f9edba 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -82,6 +83,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt new file mode 100644 index 0000000..c26e90c --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.smart.town.sanxi.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt index 8fd3296..a295ff6 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt @@ -2,32 +2,41 @@ import android.app.ProgressDialog import android.content.Intent +import android.graphics.Color import android.net.Uri import android.os.Build import android.os.CountDownTimer import android.widget.LinearLayout import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.smart.town.sanxi.BuildConfig import com.casic.smart.town.sanxi.R import com.casic.smart.town.sanxi.extensions.appendDownloadUrl +import com.casic.smart.town.sanxi.extensions.combineImagePath +import com.casic.smart.town.sanxi.extensions.compressImage +import com.casic.smart.town.sanxi.extensions.reformat import com.casic.smart.town.sanxi.model.UserDetailModel -import com.casic.smart.town.sanxi.util.AuthenticationHelper -import com.casic.smart.town.sanxi.util.LoadingDialogHub -import com.casic.smart.town.sanxi.util.LocaleConstant +import com.casic.smart.town.sanxi.util.* import com.casic.smart.town.sanxi.view.AboutUsActivity import com.casic.smart.town.sanxi.view.ChangePasswordActivity import com.casic.smart.town.sanxi.view.LoginActivity import com.casic.smart.town.sanxi.view.UpdateDataActivity +import com.casic.smart.town.sanxi.vm.UploadImageViewModel import com.casic.smart.town.sanxi.vm.UserViewModel import com.casic.smart.town.sanxi.vm.VersionViewModel +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.callback.OnDownloadListener import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.fragment_more.* import java.io.File @@ -37,13 +46,14 @@ private lateinit var user: UserDetailModel.DataModel private lateinit var userViewModel: UserViewModel private lateinit var versionViewModel: VersionViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var progressDialog: ProgressDialog override fun initLayoutView(): Int = R.layout.fragment_more override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() @@ -65,6 +75,12 @@ PageNavigationManager.finishAllActivity() } } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + //TODO 更新头像无权限,要改 + "头像更新成功".show(requireContext()) + } + } versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java] versionViewModel.versionResultModel.observe(this) { @@ -90,6 +106,29 @@ } } + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.resultModel.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + user.roleIds.reformat(), + it.data, + "", + "", + "" + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userImageView) + } + } + //初始化下载对话框 progressDialog = ProgressDialog(requireContext()) progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) @@ -105,11 +144,63 @@ else -> LoadingDialogHub.dismiss() } } + + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "图片上传中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { userImageView.setOnClickListener { - "待完善".show(requireContext()) + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(requireContext()) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(requireContext()) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.get) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() } updateUserButton.setOnClickListener { @@ -195,6 +286,20 @@ userDeptView.text = String.format("部门:${user.deptName}") } + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + private fun downloadApk(url: String?) { progressDialog.setMessage("下载新版本中...") progressDialog.show() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt index bb6a7d8..95bbfd0 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt @@ -10,7 +10,7 @@ import com.casic.smart.town.sanxi.fragment.order.NotProcessedFragment import com.casic.smart.town.sanxi.util.LocaleConstant import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.pengxh.kt.lite.extensions.getStatusBarHeight import kotlinx.android.synthetic.main.fragment_order.* class OrderPageFragment : KotlinBaseFragment() { @@ -28,7 +28,7 @@ override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt index 23648cb..b0dcc9e 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt @@ -20,12 +20,8 @@ import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToCompleteDate -import com.pengxh.kt.lite.extensions.timestampToLastWeekDate -import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_statistics.* class StatisticsPageFragment : KotlinBaseFragment() { @@ -43,7 +39,7 @@ override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt index 2ef87f8..bec4c35 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt @@ -9,6 +9,8 @@ import com.casic.smart.town.sanxi.view.order.CompletedDetailActivity import com.casic.smart.town.sanxi.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -43,8 +45,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + completedAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -52,17 +53,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + completedAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111001) } } - weakReferenceHandler.sendEmptyMessage(2022111001) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -91,30 +96,26 @@ private val callback = Handler.Callback { if (it.what == 2022111001) { - if (isRefresh || isLoadMore) { - completedAdapter.notifyDataSetChanged() - } else { - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("您还没有处理完成过任何工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - completedAdapter = OrderCompletedAdapter(requireContext(), dataBeans) - orderRecyclerView!!.adapter = completedAdapter - completedAdapter.setOnItemClickListener(object : - OrderCompletedAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) + if (dataBeans.size == 0) { + emptyView.showEmptyPage("您还没有处理完成过任何工单") { + pageIndex = 1 + obtainWorkOrderList() } + } else { + emptyView.hide() + completedAdapter = OrderCompletedAdapter(requireContext(), dataBeans) + orderRecyclerView.adapter = completedAdapter + completedAdapter.setOnItemClickListener(object : + OrderCompletedAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt index 192e0ce..e6562bd 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt @@ -9,6 +9,8 @@ import com.casic.smart.town.sanxi.view.order.InHandleDetailActivity import com.casic.smart.town.sanxi.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -43,8 +45,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + inHandleAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -52,17 +53,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + inHandleAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111004) } } - weakReferenceHandler.sendEmptyMessage(2022111004) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -91,30 +96,26 @@ private val callback = Handler.Callback { if (it.what == 2022111004) { - if (isRefresh || isLoadMore) { - inHandleAdapter.notifyDataSetChanged() - } else { //首次加载数据 - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("真不错,您已经处理完所有工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - inHandleAdapter = OrderInHandleAdapter(requireContext(), dataBeans) - orderRecyclerView!!.adapter = inHandleAdapter - inHandleAdapter.setOnItemClickListener(object : - OrderInHandleAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) + if (dataBeans.size == 0) { + emptyView.showEmptyPage("真不错,您已经处理完所有工单") { + pageIndex = 1 + obtainWorkOrderList() } + } else { + emptyView.hide() + inHandleAdapter = OrderInHandleAdapter(requireContext(), dataBeans) + orderRecyclerView.adapter = inHandleAdapter + inHandleAdapter.setOnItemClickListener(object : + OrderInHandleAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/build.gradle b/app/build.gradle index b325802..a0beed6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -59,7 +59,7 @@ dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') //基础依赖库 - implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.3' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.4' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.9.0' //Google官方授权框架 diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt index 8176a68..30a8241 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -95,6 +96,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt index 36abfdf..dedd479 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -88,6 +89,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt index e41c337..7f9edba 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -82,6 +83,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt new file mode 100644 index 0000000..c26e90c --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.smart.town.sanxi.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt index 8fd3296..a295ff6 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt @@ -2,32 +2,41 @@ import android.app.ProgressDialog import android.content.Intent +import android.graphics.Color import android.net.Uri import android.os.Build import android.os.CountDownTimer import android.widget.LinearLayout import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.smart.town.sanxi.BuildConfig import com.casic.smart.town.sanxi.R import com.casic.smart.town.sanxi.extensions.appendDownloadUrl +import com.casic.smart.town.sanxi.extensions.combineImagePath +import com.casic.smart.town.sanxi.extensions.compressImage +import com.casic.smart.town.sanxi.extensions.reformat import com.casic.smart.town.sanxi.model.UserDetailModel -import com.casic.smart.town.sanxi.util.AuthenticationHelper -import com.casic.smart.town.sanxi.util.LoadingDialogHub -import com.casic.smart.town.sanxi.util.LocaleConstant +import com.casic.smart.town.sanxi.util.* import com.casic.smart.town.sanxi.view.AboutUsActivity import com.casic.smart.town.sanxi.view.ChangePasswordActivity import com.casic.smart.town.sanxi.view.LoginActivity import com.casic.smart.town.sanxi.view.UpdateDataActivity +import com.casic.smart.town.sanxi.vm.UploadImageViewModel import com.casic.smart.town.sanxi.vm.UserViewModel import com.casic.smart.town.sanxi.vm.VersionViewModel +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.callback.OnDownloadListener import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.fragment_more.* import java.io.File @@ -37,13 +46,14 @@ private lateinit var user: UserDetailModel.DataModel private lateinit var userViewModel: UserViewModel private lateinit var versionViewModel: VersionViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var progressDialog: ProgressDialog override fun initLayoutView(): Int = R.layout.fragment_more override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() @@ -65,6 +75,12 @@ PageNavigationManager.finishAllActivity() } } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + //TODO 更新头像无权限,要改 + "头像更新成功".show(requireContext()) + } + } versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java] versionViewModel.versionResultModel.observe(this) { @@ -90,6 +106,29 @@ } } + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.resultModel.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + user.roleIds.reformat(), + it.data, + "", + "", + "" + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userImageView) + } + } + //初始化下载对话框 progressDialog = ProgressDialog(requireContext()) progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) @@ -105,11 +144,63 @@ else -> LoadingDialogHub.dismiss() } } + + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "图片上传中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { userImageView.setOnClickListener { - "待完善".show(requireContext()) + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(requireContext()) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(requireContext()) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.get) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() } updateUserButton.setOnClickListener { @@ -195,6 +286,20 @@ userDeptView.text = String.format("部门:${user.deptName}") } + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + private fun downloadApk(url: String?) { progressDialog.setMessage("下载新版本中...") progressDialog.show() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt index bb6a7d8..95bbfd0 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt @@ -10,7 +10,7 @@ import com.casic.smart.town.sanxi.fragment.order.NotProcessedFragment import com.casic.smart.town.sanxi.util.LocaleConstant import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.pengxh.kt.lite.extensions.getStatusBarHeight import kotlinx.android.synthetic.main.fragment_order.* class OrderPageFragment : KotlinBaseFragment() { @@ -28,7 +28,7 @@ override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt index 23648cb..b0dcc9e 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt @@ -20,12 +20,8 @@ import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToCompleteDate -import com.pengxh.kt.lite.extensions.timestampToLastWeekDate -import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_statistics.* class StatisticsPageFragment : KotlinBaseFragment() { @@ -43,7 +39,7 @@ override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt index 2ef87f8..bec4c35 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt @@ -9,6 +9,8 @@ import com.casic.smart.town.sanxi.view.order.CompletedDetailActivity import com.casic.smart.town.sanxi.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -43,8 +45,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + completedAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -52,17 +53,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + completedAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111001) } } - weakReferenceHandler.sendEmptyMessage(2022111001) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -91,30 +96,26 @@ private val callback = Handler.Callback { if (it.what == 2022111001) { - if (isRefresh || isLoadMore) { - completedAdapter.notifyDataSetChanged() - } else { - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("您还没有处理完成过任何工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - completedAdapter = OrderCompletedAdapter(requireContext(), dataBeans) - orderRecyclerView!!.adapter = completedAdapter - completedAdapter.setOnItemClickListener(object : - OrderCompletedAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) + if (dataBeans.size == 0) { + emptyView.showEmptyPage("您还没有处理完成过任何工单") { + pageIndex = 1 + obtainWorkOrderList() } + } else { + emptyView.hide() + completedAdapter = OrderCompletedAdapter(requireContext(), dataBeans) + orderRecyclerView.adapter = completedAdapter + completedAdapter.setOnItemClickListener(object : + OrderCompletedAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt index 192e0ce..e6562bd 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt @@ -9,6 +9,8 @@ import com.casic.smart.town.sanxi.view.order.InHandleDetailActivity import com.casic.smart.town.sanxi.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -43,8 +45,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + inHandleAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -52,17 +53,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + inHandleAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111004) } } - weakReferenceHandler.sendEmptyMessage(2022111004) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -91,30 +96,26 @@ private val callback = Handler.Callback { if (it.what == 2022111004) { - if (isRefresh || isLoadMore) { - inHandleAdapter.notifyDataSetChanged() - } else { //首次加载数据 - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("真不错,您已经处理完所有工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - inHandleAdapter = OrderInHandleAdapter(requireContext(), dataBeans) - orderRecyclerView!!.adapter = inHandleAdapter - inHandleAdapter.setOnItemClickListener(object : - OrderInHandleAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) + if (dataBeans.size == 0) { + emptyView.showEmptyPage("真不错,您已经处理完所有工单") { + pageIndex = 1 + obtainWorkOrderList() } + } else { + emptyView.hide() + inHandleAdapter = OrderInHandleAdapter(requireContext(), dataBeans) + orderRecyclerView.adapter = inHandleAdapter + inHandleAdapter.setOnItemClickListener(object : + OrderInHandleAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotConfirmedFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotConfirmedFragment.kt index 123a6af..529b2d2 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotConfirmedFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotConfirmedFragment.kt @@ -9,6 +9,8 @@ import com.casic.smart.town.sanxi.view.order.NotConfirmedDetailActivity import com.casic.smart.town.sanxi.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -43,8 +45,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + notConfirmedAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -52,17 +53,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + notConfirmedAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111002) } } - weakReferenceHandler.sendEmptyMessage(2022111002) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -91,30 +96,26 @@ private val callback = Handler.Callback { if (it.what == 2022111002) { - if (isRefresh || isLoadMore) { - notConfirmedAdapter.notifyDataSetChanged() - } else { //首次加载数据 - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("没有需要您确认的工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - notConfirmedAdapter = OrderNotConfirmedAdapter(requireContext(), dataBeans) - orderRecyclerView!!.adapter = notConfirmedAdapter - notConfirmedAdapter.setOnItemClickListener(object : - OrderNotConfirmedAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) + if (dataBeans.size == 0) { + emptyView.showEmptyPage("没有需要您确认的工单") { + pageIndex = 1 + obtainWorkOrderList() } + } else { + emptyView.hide() + notConfirmedAdapter = OrderNotConfirmedAdapter(requireContext(), dataBeans) + orderRecyclerView.adapter = notConfirmedAdapter + notConfirmedAdapter.setOnItemClickListener(object : + OrderNotConfirmedAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/build.gradle b/app/build.gradle index b325802..a0beed6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -59,7 +59,7 @@ dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') //基础依赖库 - implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.3' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.4' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.9.0' //Google官方授权框架 diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt index 8176a68..30a8241 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -95,6 +96,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt index 36abfdf..dedd479 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -88,6 +89,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt index e41c337..7f9edba 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -82,6 +83,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt new file mode 100644 index 0000000..c26e90c --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.smart.town.sanxi.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt index 8fd3296..a295ff6 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt @@ -2,32 +2,41 @@ import android.app.ProgressDialog import android.content.Intent +import android.graphics.Color import android.net.Uri import android.os.Build import android.os.CountDownTimer import android.widget.LinearLayout import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.smart.town.sanxi.BuildConfig import com.casic.smart.town.sanxi.R import com.casic.smart.town.sanxi.extensions.appendDownloadUrl +import com.casic.smart.town.sanxi.extensions.combineImagePath +import com.casic.smart.town.sanxi.extensions.compressImage +import com.casic.smart.town.sanxi.extensions.reformat import com.casic.smart.town.sanxi.model.UserDetailModel -import com.casic.smart.town.sanxi.util.AuthenticationHelper -import com.casic.smart.town.sanxi.util.LoadingDialogHub -import com.casic.smart.town.sanxi.util.LocaleConstant +import com.casic.smart.town.sanxi.util.* import com.casic.smart.town.sanxi.view.AboutUsActivity import com.casic.smart.town.sanxi.view.ChangePasswordActivity import com.casic.smart.town.sanxi.view.LoginActivity import com.casic.smart.town.sanxi.view.UpdateDataActivity +import com.casic.smart.town.sanxi.vm.UploadImageViewModel import com.casic.smart.town.sanxi.vm.UserViewModel import com.casic.smart.town.sanxi.vm.VersionViewModel +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.callback.OnDownloadListener import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.fragment_more.* import java.io.File @@ -37,13 +46,14 @@ private lateinit var user: UserDetailModel.DataModel private lateinit var userViewModel: UserViewModel private lateinit var versionViewModel: VersionViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var progressDialog: ProgressDialog override fun initLayoutView(): Int = R.layout.fragment_more override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() @@ -65,6 +75,12 @@ PageNavigationManager.finishAllActivity() } } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + //TODO 更新头像无权限,要改 + "头像更新成功".show(requireContext()) + } + } versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java] versionViewModel.versionResultModel.observe(this) { @@ -90,6 +106,29 @@ } } + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.resultModel.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + user.roleIds.reformat(), + it.data, + "", + "", + "" + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userImageView) + } + } + //初始化下载对话框 progressDialog = ProgressDialog(requireContext()) progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) @@ -105,11 +144,63 @@ else -> LoadingDialogHub.dismiss() } } + + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "图片上传中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { userImageView.setOnClickListener { - "待完善".show(requireContext()) + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(requireContext()) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(requireContext()) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.get) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() } updateUserButton.setOnClickListener { @@ -195,6 +286,20 @@ userDeptView.text = String.format("部门:${user.deptName}") } + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + private fun downloadApk(url: String?) { progressDialog.setMessage("下载新版本中...") progressDialog.show() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt index bb6a7d8..95bbfd0 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt @@ -10,7 +10,7 @@ import com.casic.smart.town.sanxi.fragment.order.NotProcessedFragment import com.casic.smart.town.sanxi.util.LocaleConstant import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.pengxh.kt.lite.extensions.getStatusBarHeight import kotlinx.android.synthetic.main.fragment_order.* class OrderPageFragment : KotlinBaseFragment() { @@ -28,7 +28,7 @@ override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt index 23648cb..b0dcc9e 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt @@ -20,12 +20,8 @@ import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToCompleteDate -import com.pengxh.kt.lite.extensions.timestampToLastWeekDate -import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_statistics.* class StatisticsPageFragment : KotlinBaseFragment() { @@ -43,7 +39,7 @@ override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt index 2ef87f8..bec4c35 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt @@ -9,6 +9,8 @@ import com.casic.smart.town.sanxi.view.order.CompletedDetailActivity import com.casic.smart.town.sanxi.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -43,8 +45,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + completedAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -52,17 +53,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + completedAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111001) } } - weakReferenceHandler.sendEmptyMessage(2022111001) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -91,30 +96,26 @@ private val callback = Handler.Callback { if (it.what == 2022111001) { - if (isRefresh || isLoadMore) { - completedAdapter.notifyDataSetChanged() - } else { - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("您还没有处理完成过任何工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - completedAdapter = OrderCompletedAdapter(requireContext(), dataBeans) - orderRecyclerView!!.adapter = completedAdapter - completedAdapter.setOnItemClickListener(object : - OrderCompletedAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) + if (dataBeans.size == 0) { + emptyView.showEmptyPage("您还没有处理完成过任何工单") { + pageIndex = 1 + obtainWorkOrderList() } + } else { + emptyView.hide() + completedAdapter = OrderCompletedAdapter(requireContext(), dataBeans) + orderRecyclerView.adapter = completedAdapter + completedAdapter.setOnItemClickListener(object : + OrderCompletedAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt index 192e0ce..e6562bd 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt @@ -9,6 +9,8 @@ import com.casic.smart.town.sanxi.view.order.InHandleDetailActivity import com.casic.smart.town.sanxi.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -43,8 +45,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + inHandleAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -52,17 +53,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + inHandleAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111004) } } - weakReferenceHandler.sendEmptyMessage(2022111004) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -91,30 +96,26 @@ private val callback = Handler.Callback { if (it.what == 2022111004) { - if (isRefresh || isLoadMore) { - inHandleAdapter.notifyDataSetChanged() - } else { //首次加载数据 - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("真不错,您已经处理完所有工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - inHandleAdapter = OrderInHandleAdapter(requireContext(), dataBeans) - orderRecyclerView!!.adapter = inHandleAdapter - inHandleAdapter.setOnItemClickListener(object : - OrderInHandleAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) + if (dataBeans.size == 0) { + emptyView.showEmptyPage("真不错,您已经处理完所有工单") { + pageIndex = 1 + obtainWorkOrderList() } + } else { + emptyView.hide() + inHandleAdapter = OrderInHandleAdapter(requireContext(), dataBeans) + orderRecyclerView.adapter = inHandleAdapter + inHandleAdapter.setOnItemClickListener(object : + OrderInHandleAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotConfirmedFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotConfirmedFragment.kt index 123a6af..529b2d2 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotConfirmedFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotConfirmedFragment.kt @@ -9,6 +9,8 @@ import com.casic.smart.town.sanxi.view.order.NotConfirmedDetailActivity import com.casic.smart.town.sanxi.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -43,8 +45,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + notConfirmedAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -52,17 +53,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + notConfirmedAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111002) } } - weakReferenceHandler.sendEmptyMessage(2022111002) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -91,30 +96,26 @@ private val callback = Handler.Callback { if (it.what == 2022111002) { - if (isRefresh || isLoadMore) { - notConfirmedAdapter.notifyDataSetChanged() - } else { //首次加载数据 - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("没有需要您确认的工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - notConfirmedAdapter = OrderNotConfirmedAdapter(requireContext(), dataBeans) - orderRecyclerView!!.adapter = notConfirmedAdapter - notConfirmedAdapter.setOnItemClickListener(object : - OrderNotConfirmedAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) + if (dataBeans.size == 0) { + emptyView.showEmptyPage("没有需要您确认的工单") { + pageIndex = 1 + obtainWorkOrderList() } + } else { + emptyView.hide() + notConfirmedAdapter = OrderNotConfirmedAdapter(requireContext(), dataBeans) + orderRecyclerView.adapter = notConfirmedAdapter + notConfirmedAdapter.setOnItemClickListener(object : + OrderNotConfirmedAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotProcessedFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotProcessedFragment.kt index a9c9878..4818538 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotProcessedFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotProcessedFragment.kt @@ -13,6 +13,8 @@ import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -68,8 +70,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + notProcessedAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -77,17 +78,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + notProcessedAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111003) } } - weakReferenceHandler.sendEmptyMessage(2022111003) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -116,39 +121,33 @@ private val callback = Handler.Callback { if (it.what == 2022111003) { - if (isRefresh || isLoadMore) { - notProcessedAdapter.notifyDataSetChanged() - } else { //首次加载数据 - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("没有需要您处理的工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - notProcessedAdapter = object : - NormalRecyclerAdapter( - R.layout.item_order_not_processed_rv, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, - position: Int, - item: OrderListModel.DataBean.RowsBean - ) { - val alarmValue = if (item.alarmValue.toString().isBlank()) { - "报警值:未知" - } else { - "报警值:" + item.alarmValue - } - viewHolder.setText(R.id.alarmContentView, item.alarmContentName) - .setText(R.id.createTimeView, item.createTime) - .setText(R.id.wellCodeView, "点位编号:${item.wellCode}") - .setText(R.id.alarmValueView, alarmValue) - .setText(R.id.wellLocationView, "点位置:${item.position}") - - viewHolder.setOnClickListener( - R.id.operationButton, - object : View.OnClickListener { + if (dataBeans.size == 0) { + emptyView.showEmptyPage("没有需要您处理的工单") { + pageIndex = 1 + obtainWorkOrderList() + } + } else { + emptyView.hide() + notProcessedAdapter = object : + NormalRecyclerAdapter( + R.layout.item_order_not_processed_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: OrderListModel.DataBean.RowsBean + ) { + val alarmValue = if (item.alarmValue.toString().isBlank()) { + "报警值:未知" + } else { + "报警值:" + item.alarmValue + } + viewHolder.setText(R.id.alarmContentView, item.alarmContentName) + .setText(R.id.createTimeView, item.createTime) + .setText(R.id.wellCodeView, "点位编号:${item.wellCode}") + .setText(R.id.alarmValueView, alarmValue) + .setText(R.id.wellLocationView, "点位置:${item.position}") + .setOnClickListener( + R.id.operationButton, object : View.OnClickListener { override fun onClick(v: View?) { //标记被点击的item位置 clickedPosition = position @@ -161,7 +160,7 @@ .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { - val jobId = dataBeans[position].jobId.toString() + val jobId = item.jobId.toString() if (jobId.isBlank()) { "工单ID异常,无法接单".show(requireContext()) return @@ -175,23 +174,22 @@ }).build().show() } }) - } } - orderRecyclerView!!.adapter = notProcessedAdapter - notProcessedAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: OrderListModel.DataBean.RowsBean - ) { - val jobId = t.jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) } + orderRecyclerView.adapter = notProcessedAdapter + notProcessedAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: OrderListModel.DataBean.RowsBean + ) { + val jobId = t.jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/build.gradle b/app/build.gradle index b325802..a0beed6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -59,7 +59,7 @@ dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') //基础依赖库 - implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.3' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.4' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.9.0' //Google官方授权框架 diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt index 8176a68..30a8241 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -95,6 +96,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt index 36abfdf..dedd479 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -88,6 +89,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt index e41c337..7f9edba 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -82,6 +83,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt new file mode 100644 index 0000000..c26e90c --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.smart.town.sanxi.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt index 8fd3296..a295ff6 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt @@ -2,32 +2,41 @@ import android.app.ProgressDialog import android.content.Intent +import android.graphics.Color import android.net.Uri import android.os.Build import android.os.CountDownTimer import android.widget.LinearLayout import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.smart.town.sanxi.BuildConfig import com.casic.smart.town.sanxi.R import com.casic.smart.town.sanxi.extensions.appendDownloadUrl +import com.casic.smart.town.sanxi.extensions.combineImagePath +import com.casic.smart.town.sanxi.extensions.compressImage +import com.casic.smart.town.sanxi.extensions.reformat import com.casic.smart.town.sanxi.model.UserDetailModel -import com.casic.smart.town.sanxi.util.AuthenticationHelper -import com.casic.smart.town.sanxi.util.LoadingDialogHub -import com.casic.smart.town.sanxi.util.LocaleConstant +import com.casic.smart.town.sanxi.util.* import com.casic.smart.town.sanxi.view.AboutUsActivity import com.casic.smart.town.sanxi.view.ChangePasswordActivity import com.casic.smart.town.sanxi.view.LoginActivity import com.casic.smart.town.sanxi.view.UpdateDataActivity +import com.casic.smart.town.sanxi.vm.UploadImageViewModel import com.casic.smart.town.sanxi.vm.UserViewModel import com.casic.smart.town.sanxi.vm.VersionViewModel +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.callback.OnDownloadListener import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.fragment_more.* import java.io.File @@ -37,13 +46,14 @@ private lateinit var user: UserDetailModel.DataModel private lateinit var userViewModel: UserViewModel private lateinit var versionViewModel: VersionViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var progressDialog: ProgressDialog override fun initLayoutView(): Int = R.layout.fragment_more override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() @@ -65,6 +75,12 @@ PageNavigationManager.finishAllActivity() } } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + //TODO 更新头像无权限,要改 + "头像更新成功".show(requireContext()) + } + } versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java] versionViewModel.versionResultModel.observe(this) { @@ -90,6 +106,29 @@ } } + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.resultModel.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + user.roleIds.reformat(), + it.data, + "", + "", + "" + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userImageView) + } + } + //初始化下载对话框 progressDialog = ProgressDialog(requireContext()) progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) @@ -105,11 +144,63 @@ else -> LoadingDialogHub.dismiss() } } + + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "图片上传中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { userImageView.setOnClickListener { - "待完善".show(requireContext()) + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(requireContext()) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(requireContext()) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.get) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() } updateUserButton.setOnClickListener { @@ -195,6 +286,20 @@ userDeptView.text = String.format("部门:${user.deptName}") } + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + private fun downloadApk(url: String?) { progressDialog.setMessage("下载新版本中...") progressDialog.show() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt index bb6a7d8..95bbfd0 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt @@ -10,7 +10,7 @@ import com.casic.smart.town.sanxi.fragment.order.NotProcessedFragment import com.casic.smart.town.sanxi.util.LocaleConstant import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.pengxh.kt.lite.extensions.getStatusBarHeight import kotlinx.android.synthetic.main.fragment_order.* class OrderPageFragment : KotlinBaseFragment() { @@ -28,7 +28,7 @@ override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt index 23648cb..b0dcc9e 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt @@ -20,12 +20,8 @@ import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToCompleteDate -import com.pengxh.kt.lite.extensions.timestampToLastWeekDate -import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_statistics.* class StatisticsPageFragment : KotlinBaseFragment() { @@ -43,7 +39,7 @@ override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt index 2ef87f8..bec4c35 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt @@ -9,6 +9,8 @@ import com.casic.smart.town.sanxi.view.order.CompletedDetailActivity import com.casic.smart.town.sanxi.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -43,8 +45,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + completedAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -52,17 +53,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + completedAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111001) } } - weakReferenceHandler.sendEmptyMessage(2022111001) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -91,30 +96,26 @@ private val callback = Handler.Callback { if (it.what == 2022111001) { - if (isRefresh || isLoadMore) { - completedAdapter.notifyDataSetChanged() - } else { - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("您还没有处理完成过任何工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - completedAdapter = OrderCompletedAdapter(requireContext(), dataBeans) - orderRecyclerView!!.adapter = completedAdapter - completedAdapter.setOnItemClickListener(object : - OrderCompletedAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) + if (dataBeans.size == 0) { + emptyView.showEmptyPage("您还没有处理完成过任何工单") { + pageIndex = 1 + obtainWorkOrderList() } + } else { + emptyView.hide() + completedAdapter = OrderCompletedAdapter(requireContext(), dataBeans) + orderRecyclerView.adapter = completedAdapter + completedAdapter.setOnItemClickListener(object : + OrderCompletedAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt index 192e0ce..e6562bd 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt @@ -9,6 +9,8 @@ import com.casic.smart.town.sanxi.view.order.InHandleDetailActivity import com.casic.smart.town.sanxi.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -43,8 +45,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + inHandleAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -52,17 +53,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + inHandleAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111004) } } - weakReferenceHandler.sendEmptyMessage(2022111004) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -91,30 +96,26 @@ private val callback = Handler.Callback { if (it.what == 2022111004) { - if (isRefresh || isLoadMore) { - inHandleAdapter.notifyDataSetChanged() - } else { //首次加载数据 - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("真不错,您已经处理完所有工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - inHandleAdapter = OrderInHandleAdapter(requireContext(), dataBeans) - orderRecyclerView!!.adapter = inHandleAdapter - inHandleAdapter.setOnItemClickListener(object : - OrderInHandleAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) + if (dataBeans.size == 0) { + emptyView.showEmptyPage("真不错,您已经处理完所有工单") { + pageIndex = 1 + obtainWorkOrderList() } + } else { + emptyView.hide() + inHandleAdapter = OrderInHandleAdapter(requireContext(), dataBeans) + orderRecyclerView.adapter = inHandleAdapter + inHandleAdapter.setOnItemClickListener(object : + OrderInHandleAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotConfirmedFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotConfirmedFragment.kt index 123a6af..529b2d2 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotConfirmedFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotConfirmedFragment.kt @@ -9,6 +9,8 @@ import com.casic.smart.town.sanxi.view.order.NotConfirmedDetailActivity import com.casic.smart.town.sanxi.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -43,8 +45,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + notConfirmedAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -52,17 +53,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + notConfirmedAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111002) } } - weakReferenceHandler.sendEmptyMessage(2022111002) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -91,30 +96,26 @@ private val callback = Handler.Callback { if (it.what == 2022111002) { - if (isRefresh || isLoadMore) { - notConfirmedAdapter.notifyDataSetChanged() - } else { //首次加载数据 - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("没有需要您确认的工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - notConfirmedAdapter = OrderNotConfirmedAdapter(requireContext(), dataBeans) - orderRecyclerView!!.adapter = notConfirmedAdapter - notConfirmedAdapter.setOnItemClickListener(object : - OrderNotConfirmedAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) + if (dataBeans.size == 0) { + emptyView.showEmptyPage("没有需要您确认的工单") { + pageIndex = 1 + obtainWorkOrderList() } + } else { + emptyView.hide() + notConfirmedAdapter = OrderNotConfirmedAdapter(requireContext(), dataBeans) + orderRecyclerView.adapter = notConfirmedAdapter + notConfirmedAdapter.setOnItemClickListener(object : + OrderNotConfirmedAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotProcessedFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotProcessedFragment.kt index a9c9878..4818538 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotProcessedFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotProcessedFragment.kt @@ -13,6 +13,8 @@ import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -68,8 +70,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + notProcessedAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -77,17 +78,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + notProcessedAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111003) } } - weakReferenceHandler.sendEmptyMessage(2022111003) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -116,39 +121,33 @@ private val callback = Handler.Callback { if (it.what == 2022111003) { - if (isRefresh || isLoadMore) { - notProcessedAdapter.notifyDataSetChanged() - } else { //首次加载数据 - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("没有需要您处理的工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - notProcessedAdapter = object : - NormalRecyclerAdapter( - R.layout.item_order_not_processed_rv, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, - position: Int, - item: OrderListModel.DataBean.RowsBean - ) { - val alarmValue = if (item.alarmValue.toString().isBlank()) { - "报警值:未知" - } else { - "报警值:" + item.alarmValue - } - viewHolder.setText(R.id.alarmContentView, item.alarmContentName) - .setText(R.id.createTimeView, item.createTime) - .setText(R.id.wellCodeView, "点位编号:${item.wellCode}") - .setText(R.id.alarmValueView, alarmValue) - .setText(R.id.wellLocationView, "点位置:${item.position}") - - viewHolder.setOnClickListener( - R.id.operationButton, - object : View.OnClickListener { + if (dataBeans.size == 0) { + emptyView.showEmptyPage("没有需要您处理的工单") { + pageIndex = 1 + obtainWorkOrderList() + } + } else { + emptyView.hide() + notProcessedAdapter = object : + NormalRecyclerAdapter( + R.layout.item_order_not_processed_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: OrderListModel.DataBean.RowsBean + ) { + val alarmValue = if (item.alarmValue.toString().isBlank()) { + "报警值:未知" + } else { + "报警值:" + item.alarmValue + } + viewHolder.setText(R.id.alarmContentView, item.alarmContentName) + .setText(R.id.createTimeView, item.createTime) + .setText(R.id.wellCodeView, "点位编号:${item.wellCode}") + .setText(R.id.alarmValueView, alarmValue) + .setText(R.id.wellLocationView, "点位置:${item.position}") + .setOnClickListener( + R.id.operationButton, object : View.OnClickListener { override fun onClick(v: View?) { //标记被点击的item位置 clickedPosition = position @@ -161,7 +160,7 @@ .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { - val jobId = dataBeans[position].jobId.toString() + val jobId = item.jobId.toString() if (jobId.isBlank()) { "工单ID异常,无法接单".show(requireContext()) return @@ -175,23 +174,22 @@ }).build().show() } }) - } } - orderRecyclerView!!.adapter = notProcessedAdapter - notProcessedAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: OrderListModel.DataBean.RowsBean - ) { - val jobId = t.jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) } + orderRecyclerView.adapter = notProcessedAdapter + notProcessedAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: OrderListModel.DataBean.RowsBean + ) { + val jobId = t.jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt index 6cb5d9c..614c656 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt @@ -130,8 +130,7 @@ urls.add(path.combineImagePath()) } } - val imageAdapter = ReadOnlyImageAdapter(this) - imageAdapter.setImageList(urls) + val imageAdapter = ReadOnlyImageAdapter(this, urls) imageGridView.adapter = imageAdapter imageGridView.setOnItemClickListener { _, _, position, _ -> if (urls[position].isEmpty()) { diff --git a/app/build.gradle b/app/build.gradle index b325802..a0beed6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -59,7 +59,7 @@ dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') //基础依赖库 - implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.3' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.4' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.9.0' //Google官方授权框架 diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt index 8176a68..30a8241 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -95,6 +96,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt index 36abfdf..dedd479 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -88,6 +89,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt index e41c337..7f9edba 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -82,6 +83,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt new file mode 100644 index 0000000..c26e90c --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.smart.town.sanxi.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt index 8fd3296..a295ff6 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt @@ -2,32 +2,41 @@ import android.app.ProgressDialog import android.content.Intent +import android.graphics.Color import android.net.Uri import android.os.Build import android.os.CountDownTimer import android.widget.LinearLayout import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.smart.town.sanxi.BuildConfig import com.casic.smart.town.sanxi.R import com.casic.smart.town.sanxi.extensions.appendDownloadUrl +import com.casic.smart.town.sanxi.extensions.combineImagePath +import com.casic.smart.town.sanxi.extensions.compressImage +import com.casic.smart.town.sanxi.extensions.reformat import com.casic.smart.town.sanxi.model.UserDetailModel -import com.casic.smart.town.sanxi.util.AuthenticationHelper -import com.casic.smart.town.sanxi.util.LoadingDialogHub -import com.casic.smart.town.sanxi.util.LocaleConstant +import com.casic.smart.town.sanxi.util.* import com.casic.smart.town.sanxi.view.AboutUsActivity import com.casic.smart.town.sanxi.view.ChangePasswordActivity import com.casic.smart.town.sanxi.view.LoginActivity import com.casic.smart.town.sanxi.view.UpdateDataActivity +import com.casic.smart.town.sanxi.vm.UploadImageViewModel import com.casic.smart.town.sanxi.vm.UserViewModel import com.casic.smart.town.sanxi.vm.VersionViewModel +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.callback.OnDownloadListener import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.fragment_more.* import java.io.File @@ -37,13 +46,14 @@ private lateinit var user: UserDetailModel.DataModel private lateinit var userViewModel: UserViewModel private lateinit var versionViewModel: VersionViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var progressDialog: ProgressDialog override fun initLayoutView(): Int = R.layout.fragment_more override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() @@ -65,6 +75,12 @@ PageNavigationManager.finishAllActivity() } } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + //TODO 更新头像无权限,要改 + "头像更新成功".show(requireContext()) + } + } versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java] versionViewModel.versionResultModel.observe(this) { @@ -90,6 +106,29 @@ } } + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.resultModel.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + user.roleIds.reformat(), + it.data, + "", + "", + "" + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userImageView) + } + } + //初始化下载对话框 progressDialog = ProgressDialog(requireContext()) progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) @@ -105,11 +144,63 @@ else -> LoadingDialogHub.dismiss() } } + + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "图片上传中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { userImageView.setOnClickListener { - "待完善".show(requireContext()) + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(requireContext()) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(requireContext()) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.get) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() } updateUserButton.setOnClickListener { @@ -195,6 +286,20 @@ userDeptView.text = String.format("部门:${user.deptName}") } + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + private fun downloadApk(url: String?) { progressDialog.setMessage("下载新版本中...") progressDialog.show() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt index bb6a7d8..95bbfd0 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt @@ -10,7 +10,7 @@ import com.casic.smart.town.sanxi.fragment.order.NotProcessedFragment import com.casic.smart.town.sanxi.util.LocaleConstant import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.pengxh.kt.lite.extensions.getStatusBarHeight import kotlinx.android.synthetic.main.fragment_order.* class OrderPageFragment : KotlinBaseFragment() { @@ -28,7 +28,7 @@ override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt index 23648cb..b0dcc9e 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt @@ -20,12 +20,8 @@ import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToCompleteDate -import com.pengxh.kt.lite.extensions.timestampToLastWeekDate -import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_statistics.* class StatisticsPageFragment : KotlinBaseFragment() { @@ -43,7 +39,7 @@ override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt index 2ef87f8..bec4c35 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt @@ -9,6 +9,8 @@ import com.casic.smart.town.sanxi.view.order.CompletedDetailActivity import com.casic.smart.town.sanxi.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -43,8 +45,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + completedAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -52,17 +53,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + completedAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111001) } } - weakReferenceHandler.sendEmptyMessage(2022111001) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -91,30 +96,26 @@ private val callback = Handler.Callback { if (it.what == 2022111001) { - if (isRefresh || isLoadMore) { - completedAdapter.notifyDataSetChanged() - } else { - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("您还没有处理完成过任何工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - completedAdapter = OrderCompletedAdapter(requireContext(), dataBeans) - orderRecyclerView!!.adapter = completedAdapter - completedAdapter.setOnItemClickListener(object : - OrderCompletedAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) + if (dataBeans.size == 0) { + emptyView.showEmptyPage("您还没有处理完成过任何工单") { + pageIndex = 1 + obtainWorkOrderList() } + } else { + emptyView.hide() + completedAdapter = OrderCompletedAdapter(requireContext(), dataBeans) + orderRecyclerView.adapter = completedAdapter + completedAdapter.setOnItemClickListener(object : + OrderCompletedAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt index 192e0ce..e6562bd 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt @@ -9,6 +9,8 @@ import com.casic.smart.town.sanxi.view.order.InHandleDetailActivity import com.casic.smart.town.sanxi.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -43,8 +45,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + inHandleAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -52,17 +53,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + inHandleAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111004) } } - weakReferenceHandler.sendEmptyMessage(2022111004) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -91,30 +96,26 @@ private val callback = Handler.Callback { if (it.what == 2022111004) { - if (isRefresh || isLoadMore) { - inHandleAdapter.notifyDataSetChanged() - } else { //首次加载数据 - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("真不错,您已经处理完所有工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - inHandleAdapter = OrderInHandleAdapter(requireContext(), dataBeans) - orderRecyclerView!!.adapter = inHandleAdapter - inHandleAdapter.setOnItemClickListener(object : - OrderInHandleAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) + if (dataBeans.size == 0) { + emptyView.showEmptyPage("真不错,您已经处理完所有工单") { + pageIndex = 1 + obtainWorkOrderList() } + } else { + emptyView.hide() + inHandleAdapter = OrderInHandleAdapter(requireContext(), dataBeans) + orderRecyclerView.adapter = inHandleAdapter + inHandleAdapter.setOnItemClickListener(object : + OrderInHandleAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotConfirmedFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotConfirmedFragment.kt index 123a6af..529b2d2 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotConfirmedFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotConfirmedFragment.kt @@ -9,6 +9,8 @@ import com.casic.smart.town.sanxi.view.order.NotConfirmedDetailActivity import com.casic.smart.town.sanxi.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -43,8 +45,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + notConfirmedAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -52,17 +53,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + notConfirmedAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111002) } } - weakReferenceHandler.sendEmptyMessage(2022111002) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -91,30 +96,26 @@ private val callback = Handler.Callback { if (it.what == 2022111002) { - if (isRefresh || isLoadMore) { - notConfirmedAdapter.notifyDataSetChanged() - } else { //首次加载数据 - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("没有需要您确认的工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - notConfirmedAdapter = OrderNotConfirmedAdapter(requireContext(), dataBeans) - orderRecyclerView!!.adapter = notConfirmedAdapter - notConfirmedAdapter.setOnItemClickListener(object : - OrderNotConfirmedAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) + if (dataBeans.size == 0) { + emptyView.showEmptyPage("没有需要您确认的工单") { + pageIndex = 1 + obtainWorkOrderList() } + } else { + emptyView.hide() + notConfirmedAdapter = OrderNotConfirmedAdapter(requireContext(), dataBeans) + orderRecyclerView.adapter = notConfirmedAdapter + notConfirmedAdapter.setOnItemClickListener(object : + OrderNotConfirmedAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotProcessedFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotProcessedFragment.kt index a9c9878..4818538 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotProcessedFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotProcessedFragment.kt @@ -13,6 +13,8 @@ import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -68,8 +70,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + notProcessedAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -77,17 +78,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + notProcessedAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111003) } } - weakReferenceHandler.sendEmptyMessage(2022111003) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -116,39 +121,33 @@ private val callback = Handler.Callback { if (it.what == 2022111003) { - if (isRefresh || isLoadMore) { - notProcessedAdapter.notifyDataSetChanged() - } else { //首次加载数据 - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("没有需要您处理的工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - notProcessedAdapter = object : - NormalRecyclerAdapter( - R.layout.item_order_not_processed_rv, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, - position: Int, - item: OrderListModel.DataBean.RowsBean - ) { - val alarmValue = if (item.alarmValue.toString().isBlank()) { - "报警值:未知" - } else { - "报警值:" + item.alarmValue - } - viewHolder.setText(R.id.alarmContentView, item.alarmContentName) - .setText(R.id.createTimeView, item.createTime) - .setText(R.id.wellCodeView, "点位编号:${item.wellCode}") - .setText(R.id.alarmValueView, alarmValue) - .setText(R.id.wellLocationView, "点位置:${item.position}") - - viewHolder.setOnClickListener( - R.id.operationButton, - object : View.OnClickListener { + if (dataBeans.size == 0) { + emptyView.showEmptyPage("没有需要您处理的工单") { + pageIndex = 1 + obtainWorkOrderList() + } + } else { + emptyView.hide() + notProcessedAdapter = object : + NormalRecyclerAdapter( + R.layout.item_order_not_processed_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: OrderListModel.DataBean.RowsBean + ) { + val alarmValue = if (item.alarmValue.toString().isBlank()) { + "报警值:未知" + } else { + "报警值:" + item.alarmValue + } + viewHolder.setText(R.id.alarmContentView, item.alarmContentName) + .setText(R.id.createTimeView, item.createTime) + .setText(R.id.wellCodeView, "点位编号:${item.wellCode}") + .setText(R.id.alarmValueView, alarmValue) + .setText(R.id.wellLocationView, "点位置:${item.position}") + .setOnClickListener( + R.id.operationButton, object : View.OnClickListener { override fun onClick(v: View?) { //标记被点击的item位置 clickedPosition = position @@ -161,7 +160,7 @@ .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { - val jobId = dataBeans[position].jobId.toString() + val jobId = item.jobId.toString() if (jobId.isBlank()) { "工单ID异常,无法接单".show(requireContext()) return @@ -175,23 +174,22 @@ }).build().show() } }) - } } - orderRecyclerView!!.adapter = notProcessedAdapter - notProcessedAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: OrderListModel.DataBean.RowsBean - ) { - val jobId = t.jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) } + orderRecyclerView.adapter = notProcessedAdapter + notProcessedAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: OrderListModel.DataBean.RowsBean + ) { + val jobId = t.jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt index 6cb5d9c..614c656 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt @@ -130,8 +130,7 @@ urls.add(path.combineImagePath()) } } - val imageAdapter = ReadOnlyImageAdapter(this) - imageAdapter.setImageList(urls) + val imageAdapter = ReadOnlyImageAdapter(this, urls) imageGridView.adapter = imageAdapter imageGridView.setOnItemClickListener { _, _, position, _ -> if (urls[position].isEmpty()) { diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt index bb2711a..83363e5 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt @@ -201,8 +201,7 @@ urls.add(path.combineImagePath()) } } - val imageAdapter = ReadOnlyImageAdapter(this) - imageAdapter.setImageList(urls) + val imageAdapter = ReadOnlyImageAdapter(this, urls) imageGridView.adapter = imageAdapter imageGridView.setOnItemClickListener { _, _, position, _ -> if (urls[position].isBlank()) { diff --git a/app/build.gradle b/app/build.gradle index b325802..a0beed6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -59,7 +59,7 @@ dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') //基础依赖库 - implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.3' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.4' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.9.0' //Google官方授权框架 diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt index 8176a68..30a8241 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -95,6 +96,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt index 36abfdf..dedd479 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -88,6 +89,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt index e41c337..7f9edba 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -82,6 +83,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt new file mode 100644 index 0000000..c26e90c --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.smart.town.sanxi.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt index 8fd3296..a295ff6 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt @@ -2,32 +2,41 @@ import android.app.ProgressDialog import android.content.Intent +import android.graphics.Color import android.net.Uri import android.os.Build import android.os.CountDownTimer import android.widget.LinearLayout import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.smart.town.sanxi.BuildConfig import com.casic.smart.town.sanxi.R import com.casic.smart.town.sanxi.extensions.appendDownloadUrl +import com.casic.smart.town.sanxi.extensions.combineImagePath +import com.casic.smart.town.sanxi.extensions.compressImage +import com.casic.smart.town.sanxi.extensions.reformat import com.casic.smart.town.sanxi.model.UserDetailModel -import com.casic.smart.town.sanxi.util.AuthenticationHelper -import com.casic.smart.town.sanxi.util.LoadingDialogHub -import com.casic.smart.town.sanxi.util.LocaleConstant +import com.casic.smart.town.sanxi.util.* import com.casic.smart.town.sanxi.view.AboutUsActivity import com.casic.smart.town.sanxi.view.ChangePasswordActivity import com.casic.smart.town.sanxi.view.LoginActivity import com.casic.smart.town.sanxi.view.UpdateDataActivity +import com.casic.smart.town.sanxi.vm.UploadImageViewModel import com.casic.smart.town.sanxi.vm.UserViewModel import com.casic.smart.town.sanxi.vm.VersionViewModel +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.callback.OnDownloadListener import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.fragment_more.* import java.io.File @@ -37,13 +46,14 @@ private lateinit var user: UserDetailModel.DataModel private lateinit var userViewModel: UserViewModel private lateinit var versionViewModel: VersionViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var progressDialog: ProgressDialog override fun initLayoutView(): Int = R.layout.fragment_more override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() @@ -65,6 +75,12 @@ PageNavigationManager.finishAllActivity() } } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + //TODO 更新头像无权限,要改 + "头像更新成功".show(requireContext()) + } + } versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java] versionViewModel.versionResultModel.observe(this) { @@ -90,6 +106,29 @@ } } + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.resultModel.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + user.roleIds.reformat(), + it.data, + "", + "", + "" + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userImageView) + } + } + //初始化下载对话框 progressDialog = ProgressDialog(requireContext()) progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) @@ -105,11 +144,63 @@ else -> LoadingDialogHub.dismiss() } } + + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "图片上传中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { userImageView.setOnClickListener { - "待完善".show(requireContext()) + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(requireContext()) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(requireContext()) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.get) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() } updateUserButton.setOnClickListener { @@ -195,6 +286,20 @@ userDeptView.text = String.format("部门:${user.deptName}") } + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + private fun downloadApk(url: String?) { progressDialog.setMessage("下载新版本中...") progressDialog.show() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt index bb6a7d8..95bbfd0 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt @@ -10,7 +10,7 @@ import com.casic.smart.town.sanxi.fragment.order.NotProcessedFragment import com.casic.smart.town.sanxi.util.LocaleConstant import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.pengxh.kt.lite.extensions.getStatusBarHeight import kotlinx.android.synthetic.main.fragment_order.* class OrderPageFragment : KotlinBaseFragment() { @@ -28,7 +28,7 @@ override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt index 23648cb..b0dcc9e 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt @@ -20,12 +20,8 @@ import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToCompleteDate -import com.pengxh.kt.lite.extensions.timestampToLastWeekDate -import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_statistics.* class StatisticsPageFragment : KotlinBaseFragment() { @@ -43,7 +39,7 @@ override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt index 2ef87f8..bec4c35 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt @@ -9,6 +9,8 @@ import com.casic.smart.town.sanxi.view.order.CompletedDetailActivity import com.casic.smart.town.sanxi.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -43,8 +45,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + completedAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -52,17 +53,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + completedAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111001) } } - weakReferenceHandler.sendEmptyMessage(2022111001) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -91,30 +96,26 @@ private val callback = Handler.Callback { if (it.what == 2022111001) { - if (isRefresh || isLoadMore) { - completedAdapter.notifyDataSetChanged() - } else { - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("您还没有处理完成过任何工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - completedAdapter = OrderCompletedAdapter(requireContext(), dataBeans) - orderRecyclerView!!.adapter = completedAdapter - completedAdapter.setOnItemClickListener(object : - OrderCompletedAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) + if (dataBeans.size == 0) { + emptyView.showEmptyPage("您还没有处理完成过任何工单") { + pageIndex = 1 + obtainWorkOrderList() } + } else { + emptyView.hide() + completedAdapter = OrderCompletedAdapter(requireContext(), dataBeans) + orderRecyclerView.adapter = completedAdapter + completedAdapter.setOnItemClickListener(object : + OrderCompletedAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt index 192e0ce..e6562bd 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt @@ -9,6 +9,8 @@ import com.casic.smart.town.sanxi.view.order.InHandleDetailActivity import com.casic.smart.town.sanxi.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -43,8 +45,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + inHandleAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -52,17 +53,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + inHandleAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111004) } } - weakReferenceHandler.sendEmptyMessage(2022111004) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -91,30 +96,26 @@ private val callback = Handler.Callback { if (it.what == 2022111004) { - if (isRefresh || isLoadMore) { - inHandleAdapter.notifyDataSetChanged() - } else { //首次加载数据 - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("真不错,您已经处理完所有工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - inHandleAdapter = OrderInHandleAdapter(requireContext(), dataBeans) - orderRecyclerView!!.adapter = inHandleAdapter - inHandleAdapter.setOnItemClickListener(object : - OrderInHandleAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) + if (dataBeans.size == 0) { + emptyView.showEmptyPage("真不错,您已经处理完所有工单") { + pageIndex = 1 + obtainWorkOrderList() } + } else { + emptyView.hide() + inHandleAdapter = OrderInHandleAdapter(requireContext(), dataBeans) + orderRecyclerView.adapter = inHandleAdapter + inHandleAdapter.setOnItemClickListener(object : + OrderInHandleAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotConfirmedFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotConfirmedFragment.kt index 123a6af..529b2d2 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotConfirmedFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotConfirmedFragment.kt @@ -9,6 +9,8 @@ import com.casic.smart.town.sanxi.view.order.NotConfirmedDetailActivity import com.casic.smart.town.sanxi.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -43,8 +45,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + notConfirmedAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -52,17 +53,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + notConfirmedAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111002) } } - weakReferenceHandler.sendEmptyMessage(2022111002) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -91,30 +96,26 @@ private val callback = Handler.Callback { if (it.what == 2022111002) { - if (isRefresh || isLoadMore) { - notConfirmedAdapter.notifyDataSetChanged() - } else { //首次加载数据 - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("没有需要您确认的工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - notConfirmedAdapter = OrderNotConfirmedAdapter(requireContext(), dataBeans) - orderRecyclerView!!.adapter = notConfirmedAdapter - notConfirmedAdapter.setOnItemClickListener(object : - OrderNotConfirmedAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) + if (dataBeans.size == 0) { + emptyView.showEmptyPage("没有需要您确认的工单") { + pageIndex = 1 + obtainWorkOrderList() } + } else { + emptyView.hide() + notConfirmedAdapter = OrderNotConfirmedAdapter(requireContext(), dataBeans) + orderRecyclerView.adapter = notConfirmedAdapter + notConfirmedAdapter.setOnItemClickListener(object : + OrderNotConfirmedAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotProcessedFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotProcessedFragment.kt index a9c9878..4818538 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotProcessedFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotProcessedFragment.kt @@ -13,6 +13,8 @@ import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -68,8 +70,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + notProcessedAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -77,17 +78,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + notProcessedAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111003) } } - weakReferenceHandler.sendEmptyMessage(2022111003) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -116,39 +121,33 @@ private val callback = Handler.Callback { if (it.what == 2022111003) { - if (isRefresh || isLoadMore) { - notProcessedAdapter.notifyDataSetChanged() - } else { //首次加载数据 - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("没有需要您处理的工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - notProcessedAdapter = object : - NormalRecyclerAdapter( - R.layout.item_order_not_processed_rv, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, - position: Int, - item: OrderListModel.DataBean.RowsBean - ) { - val alarmValue = if (item.alarmValue.toString().isBlank()) { - "报警值:未知" - } else { - "报警值:" + item.alarmValue - } - viewHolder.setText(R.id.alarmContentView, item.alarmContentName) - .setText(R.id.createTimeView, item.createTime) - .setText(R.id.wellCodeView, "点位编号:${item.wellCode}") - .setText(R.id.alarmValueView, alarmValue) - .setText(R.id.wellLocationView, "点位置:${item.position}") - - viewHolder.setOnClickListener( - R.id.operationButton, - object : View.OnClickListener { + if (dataBeans.size == 0) { + emptyView.showEmptyPage("没有需要您处理的工单") { + pageIndex = 1 + obtainWorkOrderList() + } + } else { + emptyView.hide() + notProcessedAdapter = object : + NormalRecyclerAdapter( + R.layout.item_order_not_processed_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: OrderListModel.DataBean.RowsBean + ) { + val alarmValue = if (item.alarmValue.toString().isBlank()) { + "报警值:未知" + } else { + "报警值:" + item.alarmValue + } + viewHolder.setText(R.id.alarmContentView, item.alarmContentName) + .setText(R.id.createTimeView, item.createTime) + .setText(R.id.wellCodeView, "点位编号:${item.wellCode}") + .setText(R.id.alarmValueView, alarmValue) + .setText(R.id.wellLocationView, "点位置:${item.position}") + .setOnClickListener( + R.id.operationButton, object : View.OnClickListener { override fun onClick(v: View?) { //标记被点击的item位置 clickedPosition = position @@ -161,7 +160,7 @@ .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { - val jobId = dataBeans[position].jobId.toString() + val jobId = item.jobId.toString() if (jobId.isBlank()) { "工单ID异常,无法接单".show(requireContext()) return @@ -175,23 +174,22 @@ }).build().show() } }) - } } - orderRecyclerView!!.adapter = notProcessedAdapter - notProcessedAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: OrderListModel.DataBean.RowsBean - ) { - val jobId = t.jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) } + orderRecyclerView.adapter = notProcessedAdapter + notProcessedAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: OrderListModel.DataBean.RowsBean + ) { + val jobId = t.jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt index 6cb5d9c..614c656 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt @@ -130,8 +130,7 @@ urls.add(path.combineImagePath()) } } - val imageAdapter = ReadOnlyImageAdapter(this) - imageAdapter.setImageList(urls) + val imageAdapter = ReadOnlyImageAdapter(this, urls) imageGridView.adapter = imageAdapter imageGridView.setOnItemClickListener { _, _, position, _ -> if (urls[position].isEmpty()) { diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt index bb2711a..83363e5 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt @@ -201,8 +201,7 @@ urls.add(path.combineImagePath()) } } - val imageAdapter = ReadOnlyImageAdapter(this) - imageAdapter.setImageList(urls) + val imageAdapter = ReadOnlyImageAdapter(this, urls) imageGridView.adapter = imageAdapter imageGridView.setOnItemClickListener { _, _, position, _ -> if (urls[position].isBlank()) { diff --git a/app/src/main/res/layout/fragment_order_completed.xml b/app/src/main/res/layout/fragment_order_completed.xml index 99c5a55..c43ac1a 100644 --- a/app/src/main/res/layout/fragment_order_completed.xml +++ b/app/src/main/res/layout/fragment_order_completed.xml @@ -11,25 +11,17 @@ + android:layout_height="match_parent"> - - - - + android:layout_height="wrap_content" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" /> ) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt index 36abfdf..dedd479 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -88,6 +89,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt index e41c337..7f9edba 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -82,6 +83,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt new file mode 100644 index 0000000..c26e90c --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.smart.town.sanxi.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt index 8fd3296..a295ff6 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt @@ -2,32 +2,41 @@ import android.app.ProgressDialog import android.content.Intent +import android.graphics.Color import android.net.Uri import android.os.Build import android.os.CountDownTimer import android.widget.LinearLayout import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.smart.town.sanxi.BuildConfig import com.casic.smart.town.sanxi.R import com.casic.smart.town.sanxi.extensions.appendDownloadUrl +import com.casic.smart.town.sanxi.extensions.combineImagePath +import com.casic.smart.town.sanxi.extensions.compressImage +import com.casic.smart.town.sanxi.extensions.reformat import com.casic.smart.town.sanxi.model.UserDetailModel -import com.casic.smart.town.sanxi.util.AuthenticationHelper -import com.casic.smart.town.sanxi.util.LoadingDialogHub -import com.casic.smart.town.sanxi.util.LocaleConstant +import com.casic.smart.town.sanxi.util.* import com.casic.smart.town.sanxi.view.AboutUsActivity import com.casic.smart.town.sanxi.view.ChangePasswordActivity import com.casic.smart.town.sanxi.view.LoginActivity import com.casic.smart.town.sanxi.view.UpdateDataActivity +import com.casic.smart.town.sanxi.vm.UploadImageViewModel import com.casic.smart.town.sanxi.vm.UserViewModel import com.casic.smart.town.sanxi.vm.VersionViewModel +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.callback.OnDownloadListener import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.fragment_more.* import java.io.File @@ -37,13 +46,14 @@ private lateinit var user: UserDetailModel.DataModel private lateinit var userViewModel: UserViewModel private lateinit var versionViewModel: VersionViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var progressDialog: ProgressDialog override fun initLayoutView(): Int = R.layout.fragment_more override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() @@ -65,6 +75,12 @@ PageNavigationManager.finishAllActivity() } } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + //TODO 更新头像无权限,要改 + "头像更新成功".show(requireContext()) + } + } versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java] versionViewModel.versionResultModel.observe(this) { @@ -90,6 +106,29 @@ } } + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.resultModel.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + user.roleIds.reformat(), + it.data, + "", + "", + "" + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userImageView) + } + } + //初始化下载对话框 progressDialog = ProgressDialog(requireContext()) progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) @@ -105,11 +144,63 @@ else -> LoadingDialogHub.dismiss() } } + + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "图片上传中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { userImageView.setOnClickListener { - "待完善".show(requireContext()) + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(requireContext()) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(requireContext()) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.get) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() } updateUserButton.setOnClickListener { @@ -195,6 +286,20 @@ userDeptView.text = String.format("部门:${user.deptName}") } + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + private fun downloadApk(url: String?) { progressDialog.setMessage("下载新版本中...") progressDialog.show() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt index bb6a7d8..95bbfd0 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt @@ -10,7 +10,7 @@ import com.casic.smart.town.sanxi.fragment.order.NotProcessedFragment import com.casic.smart.town.sanxi.util.LocaleConstant import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.pengxh.kt.lite.extensions.getStatusBarHeight import kotlinx.android.synthetic.main.fragment_order.* class OrderPageFragment : KotlinBaseFragment() { @@ -28,7 +28,7 @@ override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt index 23648cb..b0dcc9e 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt @@ -20,12 +20,8 @@ import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToCompleteDate -import com.pengxh.kt.lite.extensions.timestampToLastWeekDate -import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_statistics.* class StatisticsPageFragment : KotlinBaseFragment() { @@ -43,7 +39,7 @@ override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt index 2ef87f8..bec4c35 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt @@ -9,6 +9,8 @@ import com.casic.smart.town.sanxi.view.order.CompletedDetailActivity import com.casic.smart.town.sanxi.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -43,8 +45,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + completedAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -52,17 +53,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + completedAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111001) } } - weakReferenceHandler.sendEmptyMessage(2022111001) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -91,30 +96,26 @@ private val callback = Handler.Callback { if (it.what == 2022111001) { - if (isRefresh || isLoadMore) { - completedAdapter.notifyDataSetChanged() - } else { - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("您还没有处理完成过任何工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - completedAdapter = OrderCompletedAdapter(requireContext(), dataBeans) - orderRecyclerView!!.adapter = completedAdapter - completedAdapter.setOnItemClickListener(object : - OrderCompletedAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) + if (dataBeans.size == 0) { + emptyView.showEmptyPage("您还没有处理完成过任何工单") { + pageIndex = 1 + obtainWorkOrderList() } + } else { + emptyView.hide() + completedAdapter = OrderCompletedAdapter(requireContext(), dataBeans) + orderRecyclerView.adapter = completedAdapter + completedAdapter.setOnItemClickListener(object : + OrderCompletedAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt index 192e0ce..e6562bd 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt @@ -9,6 +9,8 @@ import com.casic.smart.town.sanxi.view.order.InHandleDetailActivity import com.casic.smart.town.sanxi.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -43,8 +45,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + inHandleAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -52,17 +53,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + inHandleAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111004) } } - weakReferenceHandler.sendEmptyMessage(2022111004) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -91,30 +96,26 @@ private val callback = Handler.Callback { if (it.what == 2022111004) { - if (isRefresh || isLoadMore) { - inHandleAdapter.notifyDataSetChanged() - } else { //首次加载数据 - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("真不错,您已经处理完所有工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - inHandleAdapter = OrderInHandleAdapter(requireContext(), dataBeans) - orderRecyclerView!!.adapter = inHandleAdapter - inHandleAdapter.setOnItemClickListener(object : - OrderInHandleAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) + if (dataBeans.size == 0) { + emptyView.showEmptyPage("真不错,您已经处理完所有工单") { + pageIndex = 1 + obtainWorkOrderList() } + } else { + emptyView.hide() + inHandleAdapter = OrderInHandleAdapter(requireContext(), dataBeans) + orderRecyclerView.adapter = inHandleAdapter + inHandleAdapter.setOnItemClickListener(object : + OrderInHandleAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotConfirmedFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotConfirmedFragment.kt index 123a6af..529b2d2 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotConfirmedFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotConfirmedFragment.kt @@ -9,6 +9,8 @@ import com.casic.smart.town.sanxi.view.order.NotConfirmedDetailActivity import com.casic.smart.town.sanxi.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -43,8 +45,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + notConfirmedAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -52,17 +53,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + notConfirmedAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111002) } } - weakReferenceHandler.sendEmptyMessage(2022111002) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -91,30 +96,26 @@ private val callback = Handler.Callback { if (it.what == 2022111002) { - if (isRefresh || isLoadMore) { - notConfirmedAdapter.notifyDataSetChanged() - } else { //首次加载数据 - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("没有需要您确认的工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - notConfirmedAdapter = OrderNotConfirmedAdapter(requireContext(), dataBeans) - orderRecyclerView!!.adapter = notConfirmedAdapter - notConfirmedAdapter.setOnItemClickListener(object : - OrderNotConfirmedAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) + if (dataBeans.size == 0) { + emptyView.showEmptyPage("没有需要您确认的工单") { + pageIndex = 1 + obtainWorkOrderList() } + } else { + emptyView.hide() + notConfirmedAdapter = OrderNotConfirmedAdapter(requireContext(), dataBeans) + orderRecyclerView.adapter = notConfirmedAdapter + notConfirmedAdapter.setOnItemClickListener(object : + OrderNotConfirmedAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotProcessedFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotProcessedFragment.kt index a9c9878..4818538 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotProcessedFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotProcessedFragment.kt @@ -13,6 +13,8 @@ import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -68,8 +70,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + notProcessedAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -77,17 +78,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + notProcessedAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111003) } } - weakReferenceHandler.sendEmptyMessage(2022111003) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -116,39 +121,33 @@ private val callback = Handler.Callback { if (it.what == 2022111003) { - if (isRefresh || isLoadMore) { - notProcessedAdapter.notifyDataSetChanged() - } else { //首次加载数据 - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("没有需要您处理的工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - notProcessedAdapter = object : - NormalRecyclerAdapter( - R.layout.item_order_not_processed_rv, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, - position: Int, - item: OrderListModel.DataBean.RowsBean - ) { - val alarmValue = if (item.alarmValue.toString().isBlank()) { - "报警值:未知" - } else { - "报警值:" + item.alarmValue - } - viewHolder.setText(R.id.alarmContentView, item.alarmContentName) - .setText(R.id.createTimeView, item.createTime) - .setText(R.id.wellCodeView, "点位编号:${item.wellCode}") - .setText(R.id.alarmValueView, alarmValue) - .setText(R.id.wellLocationView, "点位置:${item.position}") - - viewHolder.setOnClickListener( - R.id.operationButton, - object : View.OnClickListener { + if (dataBeans.size == 0) { + emptyView.showEmptyPage("没有需要您处理的工单") { + pageIndex = 1 + obtainWorkOrderList() + } + } else { + emptyView.hide() + notProcessedAdapter = object : + NormalRecyclerAdapter( + R.layout.item_order_not_processed_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: OrderListModel.DataBean.RowsBean + ) { + val alarmValue = if (item.alarmValue.toString().isBlank()) { + "报警值:未知" + } else { + "报警值:" + item.alarmValue + } + viewHolder.setText(R.id.alarmContentView, item.alarmContentName) + .setText(R.id.createTimeView, item.createTime) + .setText(R.id.wellCodeView, "点位编号:${item.wellCode}") + .setText(R.id.alarmValueView, alarmValue) + .setText(R.id.wellLocationView, "点位置:${item.position}") + .setOnClickListener( + R.id.operationButton, object : View.OnClickListener { override fun onClick(v: View?) { //标记被点击的item位置 clickedPosition = position @@ -161,7 +160,7 @@ .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { - val jobId = dataBeans[position].jobId.toString() + val jobId = item.jobId.toString() if (jobId.isBlank()) { "工单ID异常,无法接单".show(requireContext()) return @@ -175,23 +174,22 @@ }).build().show() } }) - } } - orderRecyclerView!!.adapter = notProcessedAdapter - notProcessedAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: OrderListModel.DataBean.RowsBean - ) { - val jobId = t.jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) } + orderRecyclerView.adapter = notProcessedAdapter + notProcessedAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: OrderListModel.DataBean.RowsBean + ) { + val jobId = t.jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt index 6cb5d9c..614c656 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt @@ -130,8 +130,7 @@ urls.add(path.combineImagePath()) } } - val imageAdapter = ReadOnlyImageAdapter(this) - imageAdapter.setImageList(urls) + val imageAdapter = ReadOnlyImageAdapter(this, urls) imageGridView.adapter = imageAdapter imageGridView.setOnItemClickListener { _, _, position, _ -> if (urls[position].isEmpty()) { diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt index bb2711a..83363e5 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt @@ -201,8 +201,7 @@ urls.add(path.combineImagePath()) } } - val imageAdapter = ReadOnlyImageAdapter(this) - imageAdapter.setImageList(urls) + val imageAdapter = ReadOnlyImageAdapter(this, urls) imageGridView.adapter = imageAdapter imageGridView.setOnItemClickListener { _, _, position, _ -> if (urls[position].isBlank()) { diff --git a/app/src/main/res/layout/fragment_order_completed.xml b/app/src/main/res/layout/fragment_order_completed.xml index 99c5a55..c43ac1a 100644 --- a/app/src/main/res/layout/fragment_order_completed.xml +++ b/app/src/main/res/layout/fragment_order_completed.xml @@ -11,25 +11,17 @@ + android:layout_height="match_parent"> - - - - + android:layout_height="wrap_content" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" /> + android:layout_height="match_parent"> - - - - + android:layout_height="wrap_content" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" /> ) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt index 36abfdf..dedd479 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -88,6 +89,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt index e41c337..7f9edba 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -82,6 +83,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt new file mode 100644 index 0000000..c26e90c --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.smart.town.sanxi.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt index 8fd3296..a295ff6 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt @@ -2,32 +2,41 @@ import android.app.ProgressDialog import android.content.Intent +import android.graphics.Color import android.net.Uri import android.os.Build import android.os.CountDownTimer import android.widget.LinearLayout import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.smart.town.sanxi.BuildConfig import com.casic.smart.town.sanxi.R import com.casic.smart.town.sanxi.extensions.appendDownloadUrl +import com.casic.smart.town.sanxi.extensions.combineImagePath +import com.casic.smart.town.sanxi.extensions.compressImage +import com.casic.smart.town.sanxi.extensions.reformat import com.casic.smart.town.sanxi.model.UserDetailModel -import com.casic.smart.town.sanxi.util.AuthenticationHelper -import com.casic.smart.town.sanxi.util.LoadingDialogHub -import com.casic.smart.town.sanxi.util.LocaleConstant +import com.casic.smart.town.sanxi.util.* import com.casic.smart.town.sanxi.view.AboutUsActivity import com.casic.smart.town.sanxi.view.ChangePasswordActivity import com.casic.smart.town.sanxi.view.LoginActivity import com.casic.smart.town.sanxi.view.UpdateDataActivity +import com.casic.smart.town.sanxi.vm.UploadImageViewModel import com.casic.smart.town.sanxi.vm.UserViewModel import com.casic.smart.town.sanxi.vm.VersionViewModel +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.callback.OnDownloadListener import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.fragment_more.* import java.io.File @@ -37,13 +46,14 @@ private lateinit var user: UserDetailModel.DataModel private lateinit var userViewModel: UserViewModel private lateinit var versionViewModel: VersionViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var progressDialog: ProgressDialog override fun initLayoutView(): Int = R.layout.fragment_more override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() @@ -65,6 +75,12 @@ PageNavigationManager.finishAllActivity() } } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + //TODO 更新头像无权限,要改 + "头像更新成功".show(requireContext()) + } + } versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java] versionViewModel.versionResultModel.observe(this) { @@ -90,6 +106,29 @@ } } + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.resultModel.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + user.roleIds.reformat(), + it.data, + "", + "", + "" + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userImageView) + } + } + //初始化下载对话框 progressDialog = ProgressDialog(requireContext()) progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) @@ -105,11 +144,63 @@ else -> LoadingDialogHub.dismiss() } } + + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "图片上传中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { userImageView.setOnClickListener { - "待完善".show(requireContext()) + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(requireContext()) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(requireContext()) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.get) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() } updateUserButton.setOnClickListener { @@ -195,6 +286,20 @@ userDeptView.text = String.format("部门:${user.deptName}") } + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + private fun downloadApk(url: String?) { progressDialog.setMessage("下载新版本中...") progressDialog.show() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt index bb6a7d8..95bbfd0 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt @@ -10,7 +10,7 @@ import com.casic.smart.town.sanxi.fragment.order.NotProcessedFragment import com.casic.smart.town.sanxi.util.LocaleConstant import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.pengxh.kt.lite.extensions.getStatusBarHeight import kotlinx.android.synthetic.main.fragment_order.* class OrderPageFragment : KotlinBaseFragment() { @@ -28,7 +28,7 @@ override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt index 23648cb..b0dcc9e 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt @@ -20,12 +20,8 @@ import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToCompleteDate -import com.pengxh.kt.lite.extensions.timestampToLastWeekDate -import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_statistics.* class StatisticsPageFragment : KotlinBaseFragment() { @@ -43,7 +39,7 @@ override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt index 2ef87f8..bec4c35 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt @@ -9,6 +9,8 @@ import com.casic.smart.town.sanxi.view.order.CompletedDetailActivity import com.casic.smart.town.sanxi.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -43,8 +45,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + completedAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -52,17 +53,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + completedAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111001) } } - weakReferenceHandler.sendEmptyMessage(2022111001) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -91,30 +96,26 @@ private val callback = Handler.Callback { if (it.what == 2022111001) { - if (isRefresh || isLoadMore) { - completedAdapter.notifyDataSetChanged() - } else { - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("您还没有处理完成过任何工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - completedAdapter = OrderCompletedAdapter(requireContext(), dataBeans) - orderRecyclerView!!.adapter = completedAdapter - completedAdapter.setOnItemClickListener(object : - OrderCompletedAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) + if (dataBeans.size == 0) { + emptyView.showEmptyPage("您还没有处理完成过任何工单") { + pageIndex = 1 + obtainWorkOrderList() } + } else { + emptyView.hide() + completedAdapter = OrderCompletedAdapter(requireContext(), dataBeans) + orderRecyclerView.adapter = completedAdapter + completedAdapter.setOnItemClickListener(object : + OrderCompletedAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt index 192e0ce..e6562bd 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt @@ -9,6 +9,8 @@ import com.casic.smart.town.sanxi.view.order.InHandleDetailActivity import com.casic.smart.town.sanxi.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -43,8 +45,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + inHandleAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -52,17 +53,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + inHandleAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111004) } } - weakReferenceHandler.sendEmptyMessage(2022111004) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -91,30 +96,26 @@ private val callback = Handler.Callback { if (it.what == 2022111004) { - if (isRefresh || isLoadMore) { - inHandleAdapter.notifyDataSetChanged() - } else { //首次加载数据 - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("真不错,您已经处理完所有工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - inHandleAdapter = OrderInHandleAdapter(requireContext(), dataBeans) - orderRecyclerView!!.adapter = inHandleAdapter - inHandleAdapter.setOnItemClickListener(object : - OrderInHandleAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) + if (dataBeans.size == 0) { + emptyView.showEmptyPage("真不错,您已经处理完所有工单") { + pageIndex = 1 + obtainWorkOrderList() } + } else { + emptyView.hide() + inHandleAdapter = OrderInHandleAdapter(requireContext(), dataBeans) + orderRecyclerView.adapter = inHandleAdapter + inHandleAdapter.setOnItemClickListener(object : + OrderInHandleAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotConfirmedFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotConfirmedFragment.kt index 123a6af..529b2d2 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotConfirmedFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotConfirmedFragment.kt @@ -9,6 +9,8 @@ import com.casic.smart.town.sanxi.view.order.NotConfirmedDetailActivity import com.casic.smart.town.sanxi.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -43,8 +45,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + notConfirmedAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -52,17 +53,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + notConfirmedAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111002) } } - weakReferenceHandler.sendEmptyMessage(2022111002) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -91,30 +96,26 @@ private val callback = Handler.Callback { if (it.what == 2022111002) { - if (isRefresh || isLoadMore) { - notConfirmedAdapter.notifyDataSetChanged() - } else { //首次加载数据 - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("没有需要您确认的工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - notConfirmedAdapter = OrderNotConfirmedAdapter(requireContext(), dataBeans) - orderRecyclerView!!.adapter = notConfirmedAdapter - notConfirmedAdapter.setOnItemClickListener(object : - OrderNotConfirmedAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) + if (dataBeans.size == 0) { + emptyView.showEmptyPage("没有需要您确认的工单") { + pageIndex = 1 + obtainWorkOrderList() } + } else { + emptyView.hide() + notConfirmedAdapter = OrderNotConfirmedAdapter(requireContext(), dataBeans) + orderRecyclerView.adapter = notConfirmedAdapter + notConfirmedAdapter.setOnItemClickListener(object : + OrderNotConfirmedAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotProcessedFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotProcessedFragment.kt index a9c9878..4818538 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotProcessedFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotProcessedFragment.kt @@ -13,6 +13,8 @@ import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -68,8 +70,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + notProcessedAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -77,17 +78,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + notProcessedAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111003) } } - weakReferenceHandler.sendEmptyMessage(2022111003) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -116,39 +121,33 @@ private val callback = Handler.Callback { if (it.what == 2022111003) { - if (isRefresh || isLoadMore) { - notProcessedAdapter.notifyDataSetChanged() - } else { //首次加载数据 - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("没有需要您处理的工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - notProcessedAdapter = object : - NormalRecyclerAdapter( - R.layout.item_order_not_processed_rv, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, - position: Int, - item: OrderListModel.DataBean.RowsBean - ) { - val alarmValue = if (item.alarmValue.toString().isBlank()) { - "报警值:未知" - } else { - "报警值:" + item.alarmValue - } - viewHolder.setText(R.id.alarmContentView, item.alarmContentName) - .setText(R.id.createTimeView, item.createTime) - .setText(R.id.wellCodeView, "点位编号:${item.wellCode}") - .setText(R.id.alarmValueView, alarmValue) - .setText(R.id.wellLocationView, "点位置:${item.position}") - - viewHolder.setOnClickListener( - R.id.operationButton, - object : View.OnClickListener { + if (dataBeans.size == 0) { + emptyView.showEmptyPage("没有需要您处理的工单") { + pageIndex = 1 + obtainWorkOrderList() + } + } else { + emptyView.hide() + notProcessedAdapter = object : + NormalRecyclerAdapter( + R.layout.item_order_not_processed_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: OrderListModel.DataBean.RowsBean + ) { + val alarmValue = if (item.alarmValue.toString().isBlank()) { + "报警值:未知" + } else { + "报警值:" + item.alarmValue + } + viewHolder.setText(R.id.alarmContentView, item.alarmContentName) + .setText(R.id.createTimeView, item.createTime) + .setText(R.id.wellCodeView, "点位编号:${item.wellCode}") + .setText(R.id.alarmValueView, alarmValue) + .setText(R.id.wellLocationView, "点位置:${item.position}") + .setOnClickListener( + R.id.operationButton, object : View.OnClickListener { override fun onClick(v: View?) { //标记被点击的item位置 clickedPosition = position @@ -161,7 +160,7 @@ .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { - val jobId = dataBeans[position].jobId.toString() + val jobId = item.jobId.toString() if (jobId.isBlank()) { "工单ID异常,无法接单".show(requireContext()) return @@ -175,23 +174,22 @@ }).build().show() } }) - } } - orderRecyclerView!!.adapter = notProcessedAdapter - notProcessedAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: OrderListModel.DataBean.RowsBean - ) { - val jobId = t.jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) } + orderRecyclerView.adapter = notProcessedAdapter + notProcessedAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: OrderListModel.DataBean.RowsBean + ) { + val jobId = t.jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt index 6cb5d9c..614c656 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt @@ -130,8 +130,7 @@ urls.add(path.combineImagePath()) } } - val imageAdapter = ReadOnlyImageAdapter(this) - imageAdapter.setImageList(urls) + val imageAdapter = ReadOnlyImageAdapter(this, urls) imageGridView.adapter = imageAdapter imageGridView.setOnItemClickListener { _, _, position, _ -> if (urls[position].isEmpty()) { diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt index bb2711a..83363e5 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt @@ -201,8 +201,7 @@ urls.add(path.combineImagePath()) } } - val imageAdapter = ReadOnlyImageAdapter(this) - imageAdapter.setImageList(urls) + val imageAdapter = ReadOnlyImageAdapter(this, urls) imageGridView.adapter = imageAdapter imageGridView.setOnItemClickListener { _, _, position, _ -> if (urls[position].isBlank()) { diff --git a/app/src/main/res/layout/fragment_order_completed.xml b/app/src/main/res/layout/fragment_order_completed.xml index 99c5a55..c43ac1a 100644 --- a/app/src/main/res/layout/fragment_order_completed.xml +++ b/app/src/main/res/layout/fragment_order_completed.xml @@ -11,25 +11,17 @@ + android:layout_height="match_parent"> - - - - + android:layout_height="wrap_content" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" /> + android:layout_height="match_parent"> - - - - + android:layout_height="wrap_content" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" /> + android:layout_height="match_parent"> - - - - + android:layout_height="wrap_content" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" /> ) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt index 36abfdf..dedd479 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -88,6 +89,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt index e41c337..7f9edba 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -82,6 +83,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt new file mode 100644 index 0000000..c26e90c --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.smart.town.sanxi.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt index 8fd3296..a295ff6 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt @@ -2,32 +2,41 @@ import android.app.ProgressDialog import android.content.Intent +import android.graphics.Color import android.net.Uri import android.os.Build import android.os.CountDownTimer import android.widget.LinearLayout import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.smart.town.sanxi.BuildConfig import com.casic.smart.town.sanxi.R import com.casic.smart.town.sanxi.extensions.appendDownloadUrl +import com.casic.smart.town.sanxi.extensions.combineImagePath +import com.casic.smart.town.sanxi.extensions.compressImage +import com.casic.smart.town.sanxi.extensions.reformat import com.casic.smart.town.sanxi.model.UserDetailModel -import com.casic.smart.town.sanxi.util.AuthenticationHelper -import com.casic.smart.town.sanxi.util.LoadingDialogHub -import com.casic.smart.town.sanxi.util.LocaleConstant +import com.casic.smart.town.sanxi.util.* import com.casic.smart.town.sanxi.view.AboutUsActivity import com.casic.smart.town.sanxi.view.ChangePasswordActivity import com.casic.smart.town.sanxi.view.LoginActivity import com.casic.smart.town.sanxi.view.UpdateDataActivity +import com.casic.smart.town.sanxi.vm.UploadImageViewModel import com.casic.smart.town.sanxi.vm.UserViewModel import com.casic.smart.town.sanxi.vm.VersionViewModel +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.callback.OnDownloadListener import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.fragment_more.* import java.io.File @@ -37,13 +46,14 @@ private lateinit var user: UserDetailModel.DataModel private lateinit var userViewModel: UserViewModel private lateinit var versionViewModel: VersionViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var progressDialog: ProgressDialog override fun initLayoutView(): Int = R.layout.fragment_more override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() @@ -65,6 +75,12 @@ PageNavigationManager.finishAllActivity() } } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + //TODO 更新头像无权限,要改 + "头像更新成功".show(requireContext()) + } + } versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java] versionViewModel.versionResultModel.observe(this) { @@ -90,6 +106,29 @@ } } + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.resultModel.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + user.roleIds.reformat(), + it.data, + "", + "", + "" + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userImageView) + } + } + //初始化下载对话框 progressDialog = ProgressDialog(requireContext()) progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) @@ -105,11 +144,63 @@ else -> LoadingDialogHub.dismiss() } } + + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "图片上传中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { userImageView.setOnClickListener { - "待完善".show(requireContext()) + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(requireContext()) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(requireContext()) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.get) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() } updateUserButton.setOnClickListener { @@ -195,6 +286,20 @@ userDeptView.text = String.format("部门:${user.deptName}") } + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + private fun downloadApk(url: String?) { progressDialog.setMessage("下载新版本中...") progressDialog.show() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt index bb6a7d8..95bbfd0 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt @@ -10,7 +10,7 @@ import com.casic.smart.town.sanxi.fragment.order.NotProcessedFragment import com.casic.smart.town.sanxi.util.LocaleConstant import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.pengxh.kt.lite.extensions.getStatusBarHeight import kotlinx.android.synthetic.main.fragment_order.* class OrderPageFragment : KotlinBaseFragment() { @@ -28,7 +28,7 @@ override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt index 23648cb..b0dcc9e 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt @@ -20,12 +20,8 @@ import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToCompleteDate -import com.pengxh.kt.lite.extensions.timestampToLastWeekDate -import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_statistics.* class StatisticsPageFragment : KotlinBaseFragment() { @@ -43,7 +39,7 @@ override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt index 2ef87f8..bec4c35 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt @@ -9,6 +9,8 @@ import com.casic.smart.town.sanxi.view.order.CompletedDetailActivity import com.casic.smart.town.sanxi.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -43,8 +45,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + completedAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -52,17 +53,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + completedAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111001) } } - weakReferenceHandler.sendEmptyMessage(2022111001) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -91,30 +96,26 @@ private val callback = Handler.Callback { if (it.what == 2022111001) { - if (isRefresh || isLoadMore) { - completedAdapter.notifyDataSetChanged() - } else { - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("您还没有处理完成过任何工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - completedAdapter = OrderCompletedAdapter(requireContext(), dataBeans) - orderRecyclerView!!.adapter = completedAdapter - completedAdapter.setOnItemClickListener(object : - OrderCompletedAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) + if (dataBeans.size == 0) { + emptyView.showEmptyPage("您还没有处理完成过任何工单") { + pageIndex = 1 + obtainWorkOrderList() } + } else { + emptyView.hide() + completedAdapter = OrderCompletedAdapter(requireContext(), dataBeans) + orderRecyclerView.adapter = completedAdapter + completedAdapter.setOnItemClickListener(object : + OrderCompletedAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt index 192e0ce..e6562bd 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt @@ -9,6 +9,8 @@ import com.casic.smart.town.sanxi.view.order.InHandleDetailActivity import com.casic.smart.town.sanxi.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -43,8 +45,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + inHandleAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -52,17 +53,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + inHandleAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111004) } } - weakReferenceHandler.sendEmptyMessage(2022111004) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -91,30 +96,26 @@ private val callback = Handler.Callback { if (it.what == 2022111004) { - if (isRefresh || isLoadMore) { - inHandleAdapter.notifyDataSetChanged() - } else { //首次加载数据 - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("真不错,您已经处理完所有工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - inHandleAdapter = OrderInHandleAdapter(requireContext(), dataBeans) - orderRecyclerView!!.adapter = inHandleAdapter - inHandleAdapter.setOnItemClickListener(object : - OrderInHandleAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) + if (dataBeans.size == 0) { + emptyView.showEmptyPage("真不错,您已经处理完所有工单") { + pageIndex = 1 + obtainWorkOrderList() } + } else { + emptyView.hide() + inHandleAdapter = OrderInHandleAdapter(requireContext(), dataBeans) + orderRecyclerView.adapter = inHandleAdapter + inHandleAdapter.setOnItemClickListener(object : + OrderInHandleAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotConfirmedFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotConfirmedFragment.kt index 123a6af..529b2d2 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotConfirmedFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotConfirmedFragment.kt @@ -9,6 +9,8 @@ import com.casic.smart.town.sanxi.view.order.NotConfirmedDetailActivity import com.casic.smart.town.sanxi.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -43,8 +45,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + notConfirmedAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -52,17 +53,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + notConfirmedAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111002) } } - weakReferenceHandler.sendEmptyMessage(2022111002) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -91,30 +96,26 @@ private val callback = Handler.Callback { if (it.what == 2022111002) { - if (isRefresh || isLoadMore) { - notConfirmedAdapter.notifyDataSetChanged() - } else { //首次加载数据 - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("没有需要您确认的工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - notConfirmedAdapter = OrderNotConfirmedAdapter(requireContext(), dataBeans) - orderRecyclerView!!.adapter = notConfirmedAdapter - notConfirmedAdapter.setOnItemClickListener(object : - OrderNotConfirmedAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) + if (dataBeans.size == 0) { + emptyView.showEmptyPage("没有需要您确认的工单") { + pageIndex = 1 + obtainWorkOrderList() } + } else { + emptyView.hide() + notConfirmedAdapter = OrderNotConfirmedAdapter(requireContext(), dataBeans) + orderRecyclerView.adapter = notConfirmedAdapter + notConfirmedAdapter.setOnItemClickListener(object : + OrderNotConfirmedAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotProcessedFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotProcessedFragment.kt index a9c9878..4818538 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotProcessedFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotProcessedFragment.kt @@ -13,6 +13,8 @@ import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -68,8 +70,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + notProcessedAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -77,17 +78,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + notProcessedAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111003) } } - weakReferenceHandler.sendEmptyMessage(2022111003) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -116,39 +121,33 @@ private val callback = Handler.Callback { if (it.what == 2022111003) { - if (isRefresh || isLoadMore) { - notProcessedAdapter.notifyDataSetChanged() - } else { //首次加载数据 - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("没有需要您处理的工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - notProcessedAdapter = object : - NormalRecyclerAdapter( - R.layout.item_order_not_processed_rv, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, - position: Int, - item: OrderListModel.DataBean.RowsBean - ) { - val alarmValue = if (item.alarmValue.toString().isBlank()) { - "报警值:未知" - } else { - "报警值:" + item.alarmValue - } - viewHolder.setText(R.id.alarmContentView, item.alarmContentName) - .setText(R.id.createTimeView, item.createTime) - .setText(R.id.wellCodeView, "点位编号:${item.wellCode}") - .setText(R.id.alarmValueView, alarmValue) - .setText(R.id.wellLocationView, "点位置:${item.position}") - - viewHolder.setOnClickListener( - R.id.operationButton, - object : View.OnClickListener { + if (dataBeans.size == 0) { + emptyView.showEmptyPage("没有需要您处理的工单") { + pageIndex = 1 + obtainWorkOrderList() + } + } else { + emptyView.hide() + notProcessedAdapter = object : + NormalRecyclerAdapter( + R.layout.item_order_not_processed_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: OrderListModel.DataBean.RowsBean + ) { + val alarmValue = if (item.alarmValue.toString().isBlank()) { + "报警值:未知" + } else { + "报警值:" + item.alarmValue + } + viewHolder.setText(R.id.alarmContentView, item.alarmContentName) + .setText(R.id.createTimeView, item.createTime) + .setText(R.id.wellCodeView, "点位编号:${item.wellCode}") + .setText(R.id.alarmValueView, alarmValue) + .setText(R.id.wellLocationView, "点位置:${item.position}") + .setOnClickListener( + R.id.operationButton, object : View.OnClickListener { override fun onClick(v: View?) { //标记被点击的item位置 clickedPosition = position @@ -161,7 +160,7 @@ .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { - val jobId = dataBeans[position].jobId.toString() + val jobId = item.jobId.toString() if (jobId.isBlank()) { "工单ID异常,无法接单".show(requireContext()) return @@ -175,23 +174,22 @@ }).build().show() } }) - } } - orderRecyclerView!!.adapter = notProcessedAdapter - notProcessedAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: OrderListModel.DataBean.RowsBean - ) { - val jobId = t.jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) } + orderRecyclerView.adapter = notProcessedAdapter + notProcessedAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: OrderListModel.DataBean.RowsBean + ) { + val jobId = t.jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt index 6cb5d9c..614c656 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt @@ -130,8 +130,7 @@ urls.add(path.combineImagePath()) } } - val imageAdapter = ReadOnlyImageAdapter(this) - imageAdapter.setImageList(urls) + val imageAdapter = ReadOnlyImageAdapter(this, urls) imageGridView.adapter = imageAdapter imageGridView.setOnItemClickListener { _, _, position, _ -> if (urls[position].isEmpty()) { diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt index bb2711a..83363e5 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt @@ -201,8 +201,7 @@ urls.add(path.combineImagePath()) } } - val imageAdapter = ReadOnlyImageAdapter(this) - imageAdapter.setImageList(urls) + val imageAdapter = ReadOnlyImageAdapter(this, urls) imageGridView.adapter = imageAdapter imageGridView.setOnItemClickListener { _, _, position, _ -> if (urls[position].isBlank()) { diff --git a/app/src/main/res/layout/fragment_order_completed.xml b/app/src/main/res/layout/fragment_order_completed.xml index 99c5a55..c43ac1a 100644 --- a/app/src/main/res/layout/fragment_order_completed.xml +++ b/app/src/main/res/layout/fragment_order_completed.xml @@ -11,25 +11,17 @@ + android:layout_height="match_parent"> - - - - + android:layout_height="wrap_content" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" /> + android:layout_height="match_parent"> - - - - + android:layout_height="wrap_content" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" /> + android:layout_height="match_parent"> - - - - + android:layout_height="wrap_content" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" /> + android:layout_height="match_parent"> - - - - + android:layout_height="wrap_content" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" /> ) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt index 36abfdf..dedd479 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -88,6 +89,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt index e41c337..7f9edba 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -82,6 +83,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt new file mode 100644 index 0000000..c26e90c --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.smart.town.sanxi.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt index 8fd3296..a295ff6 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt @@ -2,32 +2,41 @@ import android.app.ProgressDialog import android.content.Intent +import android.graphics.Color import android.net.Uri import android.os.Build import android.os.CountDownTimer import android.widget.LinearLayout import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.smart.town.sanxi.BuildConfig import com.casic.smart.town.sanxi.R import com.casic.smart.town.sanxi.extensions.appendDownloadUrl +import com.casic.smart.town.sanxi.extensions.combineImagePath +import com.casic.smart.town.sanxi.extensions.compressImage +import com.casic.smart.town.sanxi.extensions.reformat import com.casic.smart.town.sanxi.model.UserDetailModel -import com.casic.smart.town.sanxi.util.AuthenticationHelper -import com.casic.smart.town.sanxi.util.LoadingDialogHub -import com.casic.smart.town.sanxi.util.LocaleConstant +import com.casic.smart.town.sanxi.util.* import com.casic.smart.town.sanxi.view.AboutUsActivity import com.casic.smart.town.sanxi.view.ChangePasswordActivity import com.casic.smart.town.sanxi.view.LoginActivity import com.casic.smart.town.sanxi.view.UpdateDataActivity +import com.casic.smart.town.sanxi.vm.UploadImageViewModel import com.casic.smart.town.sanxi.vm.UserViewModel import com.casic.smart.town.sanxi.vm.VersionViewModel +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.callback.OnDownloadListener import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.fragment_more.* import java.io.File @@ -37,13 +46,14 @@ private lateinit var user: UserDetailModel.DataModel private lateinit var userViewModel: UserViewModel private lateinit var versionViewModel: VersionViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var progressDialog: ProgressDialog override fun initLayoutView(): Int = R.layout.fragment_more override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() @@ -65,6 +75,12 @@ PageNavigationManager.finishAllActivity() } } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + //TODO 更新头像无权限,要改 + "头像更新成功".show(requireContext()) + } + } versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java] versionViewModel.versionResultModel.observe(this) { @@ -90,6 +106,29 @@ } } + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.resultModel.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + user.roleIds.reformat(), + it.data, + "", + "", + "" + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userImageView) + } + } + //初始化下载对话框 progressDialog = ProgressDialog(requireContext()) progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) @@ -105,11 +144,63 @@ else -> LoadingDialogHub.dismiss() } } + + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "图片上传中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { userImageView.setOnClickListener { - "待完善".show(requireContext()) + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(requireContext()) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(requireContext()) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.get) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() } updateUserButton.setOnClickListener { @@ -195,6 +286,20 @@ userDeptView.text = String.format("部门:${user.deptName}") } + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + private fun downloadApk(url: String?) { progressDialog.setMessage("下载新版本中...") progressDialog.show() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt index bb6a7d8..95bbfd0 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt @@ -10,7 +10,7 @@ import com.casic.smart.town.sanxi.fragment.order.NotProcessedFragment import com.casic.smart.town.sanxi.util.LocaleConstant import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.pengxh.kt.lite.extensions.getStatusBarHeight import kotlinx.android.synthetic.main.fragment_order.* class OrderPageFragment : KotlinBaseFragment() { @@ -28,7 +28,7 @@ override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt index 23648cb..b0dcc9e 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt @@ -20,12 +20,8 @@ import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToCompleteDate -import com.pengxh.kt.lite.extensions.timestampToLastWeekDate -import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_statistics.* class StatisticsPageFragment : KotlinBaseFragment() { @@ -43,7 +39,7 @@ override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt index 2ef87f8..bec4c35 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt @@ -9,6 +9,8 @@ import com.casic.smart.town.sanxi.view.order.CompletedDetailActivity import com.casic.smart.town.sanxi.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -43,8 +45,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + completedAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -52,17 +53,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + completedAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111001) } } - weakReferenceHandler.sendEmptyMessage(2022111001) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -91,30 +96,26 @@ private val callback = Handler.Callback { if (it.what == 2022111001) { - if (isRefresh || isLoadMore) { - completedAdapter.notifyDataSetChanged() - } else { - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("您还没有处理完成过任何工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - completedAdapter = OrderCompletedAdapter(requireContext(), dataBeans) - orderRecyclerView!!.adapter = completedAdapter - completedAdapter.setOnItemClickListener(object : - OrderCompletedAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) + if (dataBeans.size == 0) { + emptyView.showEmptyPage("您还没有处理完成过任何工单") { + pageIndex = 1 + obtainWorkOrderList() } + } else { + emptyView.hide() + completedAdapter = OrderCompletedAdapter(requireContext(), dataBeans) + orderRecyclerView.adapter = completedAdapter + completedAdapter.setOnItemClickListener(object : + OrderCompletedAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt index 192e0ce..e6562bd 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt @@ -9,6 +9,8 @@ import com.casic.smart.town.sanxi.view.order.InHandleDetailActivity import com.casic.smart.town.sanxi.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -43,8 +45,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + inHandleAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -52,17 +53,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + inHandleAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111004) } } - weakReferenceHandler.sendEmptyMessage(2022111004) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -91,30 +96,26 @@ private val callback = Handler.Callback { if (it.what == 2022111004) { - if (isRefresh || isLoadMore) { - inHandleAdapter.notifyDataSetChanged() - } else { //首次加载数据 - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("真不错,您已经处理完所有工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - inHandleAdapter = OrderInHandleAdapter(requireContext(), dataBeans) - orderRecyclerView!!.adapter = inHandleAdapter - inHandleAdapter.setOnItemClickListener(object : - OrderInHandleAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) + if (dataBeans.size == 0) { + emptyView.showEmptyPage("真不错,您已经处理完所有工单") { + pageIndex = 1 + obtainWorkOrderList() } + } else { + emptyView.hide() + inHandleAdapter = OrderInHandleAdapter(requireContext(), dataBeans) + orderRecyclerView.adapter = inHandleAdapter + inHandleAdapter.setOnItemClickListener(object : + OrderInHandleAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotConfirmedFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotConfirmedFragment.kt index 123a6af..529b2d2 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotConfirmedFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotConfirmedFragment.kt @@ -9,6 +9,8 @@ import com.casic.smart.town.sanxi.view.order.NotConfirmedDetailActivity import com.casic.smart.town.sanxi.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -43,8 +45,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + notConfirmedAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -52,17 +53,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + notConfirmedAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111002) } } - weakReferenceHandler.sendEmptyMessage(2022111002) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -91,30 +96,26 @@ private val callback = Handler.Callback { if (it.what == 2022111002) { - if (isRefresh || isLoadMore) { - notConfirmedAdapter.notifyDataSetChanged() - } else { //首次加载数据 - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("没有需要您确认的工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - notConfirmedAdapter = OrderNotConfirmedAdapter(requireContext(), dataBeans) - orderRecyclerView!!.adapter = notConfirmedAdapter - notConfirmedAdapter.setOnItemClickListener(object : - OrderNotConfirmedAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) + if (dataBeans.size == 0) { + emptyView.showEmptyPage("没有需要您确认的工单") { + pageIndex = 1 + obtainWorkOrderList() } + } else { + emptyView.hide() + notConfirmedAdapter = OrderNotConfirmedAdapter(requireContext(), dataBeans) + orderRecyclerView.adapter = notConfirmedAdapter + notConfirmedAdapter.setOnItemClickListener(object : + OrderNotConfirmedAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotProcessedFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotProcessedFragment.kt index a9c9878..4818538 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotProcessedFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotProcessedFragment.kt @@ -13,6 +13,8 @@ import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -68,8 +70,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + notProcessedAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -77,17 +78,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + notProcessedAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111003) } } - weakReferenceHandler.sendEmptyMessage(2022111003) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -116,39 +121,33 @@ private val callback = Handler.Callback { if (it.what == 2022111003) { - if (isRefresh || isLoadMore) { - notProcessedAdapter.notifyDataSetChanged() - } else { //首次加载数据 - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("没有需要您处理的工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - notProcessedAdapter = object : - NormalRecyclerAdapter( - R.layout.item_order_not_processed_rv, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, - position: Int, - item: OrderListModel.DataBean.RowsBean - ) { - val alarmValue = if (item.alarmValue.toString().isBlank()) { - "报警值:未知" - } else { - "报警值:" + item.alarmValue - } - viewHolder.setText(R.id.alarmContentView, item.alarmContentName) - .setText(R.id.createTimeView, item.createTime) - .setText(R.id.wellCodeView, "点位编号:${item.wellCode}") - .setText(R.id.alarmValueView, alarmValue) - .setText(R.id.wellLocationView, "点位置:${item.position}") - - viewHolder.setOnClickListener( - R.id.operationButton, - object : View.OnClickListener { + if (dataBeans.size == 0) { + emptyView.showEmptyPage("没有需要您处理的工单") { + pageIndex = 1 + obtainWorkOrderList() + } + } else { + emptyView.hide() + notProcessedAdapter = object : + NormalRecyclerAdapter( + R.layout.item_order_not_processed_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: OrderListModel.DataBean.RowsBean + ) { + val alarmValue = if (item.alarmValue.toString().isBlank()) { + "报警值:未知" + } else { + "报警值:" + item.alarmValue + } + viewHolder.setText(R.id.alarmContentView, item.alarmContentName) + .setText(R.id.createTimeView, item.createTime) + .setText(R.id.wellCodeView, "点位编号:${item.wellCode}") + .setText(R.id.alarmValueView, alarmValue) + .setText(R.id.wellLocationView, "点位置:${item.position}") + .setOnClickListener( + R.id.operationButton, object : View.OnClickListener { override fun onClick(v: View?) { //标记被点击的item位置 clickedPosition = position @@ -161,7 +160,7 @@ .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { - val jobId = dataBeans[position].jobId.toString() + val jobId = item.jobId.toString() if (jobId.isBlank()) { "工单ID异常,无法接单".show(requireContext()) return @@ -175,23 +174,22 @@ }).build().show() } }) - } } - orderRecyclerView!!.adapter = notProcessedAdapter - notProcessedAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: OrderListModel.DataBean.RowsBean - ) { - val jobId = t.jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) } + orderRecyclerView.adapter = notProcessedAdapter + notProcessedAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: OrderListModel.DataBean.RowsBean + ) { + val jobId = t.jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt index 6cb5d9c..614c656 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt @@ -130,8 +130,7 @@ urls.add(path.combineImagePath()) } } - val imageAdapter = ReadOnlyImageAdapter(this) - imageAdapter.setImageList(urls) + val imageAdapter = ReadOnlyImageAdapter(this, urls) imageGridView.adapter = imageAdapter imageGridView.setOnItemClickListener { _, _, position, _ -> if (urls[position].isEmpty()) { diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt index bb2711a..83363e5 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt @@ -201,8 +201,7 @@ urls.add(path.combineImagePath()) } } - val imageAdapter = ReadOnlyImageAdapter(this) - imageAdapter.setImageList(urls) + val imageAdapter = ReadOnlyImageAdapter(this, urls) imageGridView.adapter = imageAdapter imageGridView.setOnItemClickListener { _, _, position, _ -> if (urls[position].isBlank()) { diff --git a/app/src/main/res/layout/fragment_order_completed.xml b/app/src/main/res/layout/fragment_order_completed.xml index 99c5a55..c43ac1a 100644 --- a/app/src/main/res/layout/fragment_order_completed.xml +++ b/app/src/main/res/layout/fragment_order_completed.xml @@ -11,25 +11,17 @@ + android:layout_height="match_parent"> - - - - + android:layout_height="wrap_content" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" /> + android:layout_height="match_parent"> - - - - + android:layout_height="wrap_content" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" /> + android:layout_height="match_parent"> - - - - + android:layout_height="wrap_content" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" /> + android:layout_height="match_parent"> - - - - + android:layout_height="wrap_content" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" /> diff --git a/app/build.gradle b/app/build.gradle index b325802..a0beed6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -59,7 +59,7 @@ dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') //基础依赖库 - implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.3' + implementation 'com.github.AndroidCoderPeng:Kotlin-lite-lib:1.0.4.4' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.core:core-ktx:1.9.0' //Google官方授权框架 diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt index 8176a68..30a8241 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderCompletedAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -95,6 +96,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt index 36abfdf..dedd479 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderInHandleAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -88,6 +89,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt index e41c337..7f9edba 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/adapter/OrderNotConfirmedAdapter.kt @@ -1,5 +1,6 @@ package com.casic.smart.town.sanxi.adapter +import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater import android.view.View @@ -82,6 +83,18 @@ return expandableList } + @SuppressLint("NotifyDataSetChanged") + fun setRefreshData(dataRows: MutableList) { + this.dataRows.clear() + this.dataRows.addAll(dataRows) + notifyDataSetChanged() + } + + fun setLoadMoreData(dataRows: MutableList) { + this.dataRows.addAll(dataRows) + notifyItemRangeInserted(this.dataRows.size, dataRows.size) + } + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { var alarmContentView: TextView = view.findViewById(R.id.alarmContentView) var createTimeView: TextView = view.findViewById(R.id.createTimeView) diff --git a/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt b/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt new file mode 100644 index 0000000..c26e90c --- /dev/null +++ b/app/src/main/java/com/casic/smart/town/sanxi/extensions/List.kt @@ -0,0 +1,16 @@ +package com.casic.smart.town.sanxi.extensions + +//将集合格式化成满足上传格式的数据 +fun List.reformat(): String { + if (this.isEmpty()) return "" + val builder = StringBuilder() + //循环遍历元素,同时得到元素index(下标) + this.forEachIndexed { index, l -> + if (index == this.size - 1) { + builder.append(l) + } else { + builder.append(l).append(",") + } + } + return builder.toString() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt index 8fd3296..a295ff6 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/MorePageFragment.kt @@ -2,32 +2,41 @@ import android.app.ProgressDialog import android.content.Intent +import android.graphics.Color import android.net.Uri import android.os.Build import android.os.CountDownTimer import android.widget.LinearLayout import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions import com.casic.smart.town.sanxi.BuildConfig import com.casic.smart.town.sanxi.R import com.casic.smart.town.sanxi.extensions.appendDownloadUrl +import com.casic.smart.town.sanxi.extensions.combineImagePath +import com.casic.smart.town.sanxi.extensions.compressImage +import com.casic.smart.town.sanxi.extensions.reformat import com.casic.smart.town.sanxi.model.UserDetailModel -import com.casic.smart.town.sanxi.util.AuthenticationHelper -import com.casic.smart.town.sanxi.util.LoadingDialogHub -import com.casic.smart.town.sanxi.util.LocaleConstant +import com.casic.smart.town.sanxi.util.* import com.casic.smart.town.sanxi.view.AboutUsActivity import com.casic.smart.town.sanxi.view.ChangePasswordActivity import com.casic.smart.town.sanxi.view.LoginActivity import com.casic.smart.town.sanxi.view.UpdateDataActivity +import com.casic.smart.town.sanxi.vm.UploadImageViewModel import com.casic.smart.town.sanxi.vm.UserViewModel import com.casic.smart.town.sanxi.vm.VersionViewModel +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.callback.OnDownloadListener import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.PageNavigationManager import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import kotlinx.android.synthetic.main.fragment_more.* import java.io.File @@ -37,13 +46,14 @@ private lateinit var user: UserDetailModel.DataModel private lateinit var userViewModel: UserViewModel private lateinit var versionViewModel: VersionViewModel + private lateinit var uploadImageViewModel: UploadImageViewModel private lateinit var progressDialog: ProgressDialog override fun initLayoutView(): Int = R.layout.fragment_more override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() @@ -65,6 +75,12 @@ PageNavigationManager.finishAllActivity() } } + userViewModel.updateResult.observe(this) { + if (it.code == 200) { + //TODO 更新头像无权限,要改 + "头像更新成功".show(requireContext()) + } + } versionViewModel = ViewModelProvider(this)[VersionViewModel::class.java] versionViewModel.versionResultModel.observe(this) { @@ -90,6 +106,29 @@ } } + uploadImageViewModel = ViewModelProvider(this)[UploadImageViewModel::class.java] + uploadImageViewModel.resultModel.observe(this) { + if (it.code == 200) { + //更新用户信息表 + userViewModel.updateUserInfo( + user.id, + user.account, + user.name, + user.deptId, + user.roleIds.reformat(), + it.data, + "", + "", + "" + ) + + Glide.with(requireContext()) + .load(it.data.combineImagePath()) + .apply(RequestOptions.circleCropTransform()) + .into(userImageView) + } + } + //初始化下载对话框 progressDialog = ProgressDialog(requireContext()) progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL) @@ -105,11 +144,63 @@ else -> LoadingDialogHub.dismiss() } } + + uploadImageViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(requireActivity(), "图片上传中,请稍后...") + else -> LoadingDialogHub.dismiss() + } + } } override fun initEvent() { userImageView.setOnClickListener { - "待完善".show(requireContext()) + BottomActionSheet.Builder() + .setContext(requireContext()) + .setItemTextColor(Color.BLUE) + .setActionItemTitle(listOf("拍照", "相册")) + .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { + override fun onActionItemClick(position: Int) { + when (position) { + 0 -> PictureSelector.create(requireContext()) + .openCamera(SelectMimeType.ofImage()) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "拍照失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + 1 -> PictureSelector.create(requireContext()) + .openGallery(SelectMimeType.ofImage()) + .isGif(false) + .isMaxSelectEnabledMask(true) + .setFilterMinFileSize(100) + .setMaxSelectNum(1) + .isDisplayCamera(false) + .setImageEngine(GlideLoadEngine.get) + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + if (result == null) { + "选择照片失败,请重试".show(requireContext()) + return + } + analyticalSelectResults(result[0]) + } + + override fun onCancel() { + + } + }) + } + } + }).build().show() } updateUserButton.setOnClickListener { @@ -195,6 +286,20 @@ userDeptView.text = String.format("部门:${user.deptName}") } + private fun analyticalSelectResults(result: LocalMedia) { + //压缩图片后上传 + result.realPath.compressImage(requireContext(), object : OnImageCompressListener { + override fun onSuccess(file: File) { + //上传图片 + uploadImageViewModel.uploadImage(file) + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) + } + private fun downloadApk(url: String?) { progressDialog.setMessage("下载新版本中...") progressDialog.show() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt index bb6a7d8..95bbfd0 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/OrderPageFragment.kt @@ -10,7 +10,7 @@ import com.casic.smart.town.sanxi.fragment.order.NotProcessedFragment import com.casic.smart.town.sanxi.util.LocaleConstant import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.qmuiteam.qmui.util.QMUIDisplayHelper +import com.pengxh.kt.lite.extensions.getStatusBarHeight import kotlinx.android.synthetic.main.fragment_order.* class OrderPageFragment : KotlinBaseFragment() { @@ -28,7 +28,7 @@ override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt index 23648cb..b0dcc9e 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/StatisticsPageFragment.kt @@ -20,12 +20,8 @@ import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.timestampToCompleteDate -import com.pengxh.kt.lite.extensions.timestampToLastWeekDate -import com.pengxh.kt.lite.extensions.toJson +import com.pengxh.kt.lite.extensions.* import com.pengxh.kt.lite.utils.SaveKeyValues -import com.qmuiteam.qmui.util.QMUIDisplayHelper import kotlinx.android.synthetic.main.fragment_statistics.* class StatisticsPageFragment : KotlinBaseFragment() { @@ -43,7 +39,7 @@ override fun setupTopBarLayout() { //根据不同设备状态栏高度设置statusBarView高度 - val statusBarHeight = QMUIDisplayHelper.getStatusBarHeight(requireContext()) + val statusBarHeight = requireContext().getStatusBarHeight() val params = statusBarView.layoutParams as LinearLayout.LayoutParams params.height = statusBarHeight statusBarView.requestLayout() diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt index 2ef87f8..bec4c35 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/CompletedFragment.kt @@ -9,6 +9,8 @@ import com.casic.smart.town.sanxi.view.order.CompletedDetailActivity import com.casic.smart.town.sanxi.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -43,8 +45,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + completedAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -52,17 +53,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + completedAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111001) } } - weakReferenceHandler.sendEmptyMessage(2022111001) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -91,30 +96,26 @@ private val callback = Handler.Callback { if (it.what == 2022111001) { - if (isRefresh || isLoadMore) { - completedAdapter.notifyDataSetChanged() - } else { - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("您还没有处理完成过任何工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - completedAdapter = OrderCompletedAdapter(requireContext(), dataBeans) - orderRecyclerView!!.adapter = completedAdapter - completedAdapter.setOnItemClickListener(object : - OrderCompletedAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) + if (dataBeans.size == 0) { + emptyView.showEmptyPage("您还没有处理完成过任何工单") { + pageIndex = 1 + obtainWorkOrderList() } + } else { + emptyView.hide() + completedAdapter = OrderCompletedAdapter(requireContext(), dataBeans) + orderRecyclerView.adapter = completedAdapter + completedAdapter.setOnItemClickListener(object : + OrderCompletedAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt index 192e0ce..e6562bd 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/InHandleFragment.kt @@ -9,6 +9,8 @@ import com.casic.smart.town.sanxi.view.order.InHandleDetailActivity import com.casic.smart.town.sanxi.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -43,8 +45,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + inHandleAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -52,17 +53,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + inHandleAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111004) } } - weakReferenceHandler.sendEmptyMessage(2022111004) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -91,30 +96,26 @@ private val callback = Handler.Callback { if (it.what == 2022111004) { - if (isRefresh || isLoadMore) { - inHandleAdapter.notifyDataSetChanged() - } else { //首次加载数据 - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("真不错,您已经处理完所有工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - inHandleAdapter = OrderInHandleAdapter(requireContext(), dataBeans) - orderRecyclerView!!.adapter = inHandleAdapter - inHandleAdapter.setOnItemClickListener(object : - OrderInHandleAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) + if (dataBeans.size == 0) { + emptyView.showEmptyPage("真不错,您已经处理完所有工单") { + pageIndex = 1 + obtainWorkOrderList() } + } else { + emptyView.hide() + inHandleAdapter = OrderInHandleAdapter(requireContext(), dataBeans) + orderRecyclerView.adapter = inHandleAdapter + inHandleAdapter.setOnItemClickListener(object : + OrderInHandleAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotConfirmedFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotConfirmedFragment.kt index 123a6af..529b2d2 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotConfirmedFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotConfirmedFragment.kt @@ -9,6 +9,8 @@ import com.casic.smart.town.sanxi.view.order.NotConfirmedDetailActivity import com.casic.smart.town.sanxi.vm.OrderViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -43,8 +45,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + notConfirmedAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -52,17 +53,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + notConfirmedAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111002) } } - weakReferenceHandler.sendEmptyMessage(2022111002) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -91,30 +96,26 @@ private val callback = Handler.Callback { if (it.what == 2022111002) { - if (isRefresh || isLoadMore) { - notConfirmedAdapter.notifyDataSetChanged() - } else { //首次加载数据 - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("没有需要您确认的工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - notConfirmedAdapter = OrderNotConfirmedAdapter(requireContext(), dataBeans) - orderRecyclerView!!.adapter = notConfirmedAdapter - notConfirmedAdapter.setOnItemClickListener(object : - OrderNotConfirmedAdapter.OnItemClickListener { - override fun onClicked(position: Int) { - val jobId = dataBeans[position].jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) + if (dataBeans.size == 0) { + emptyView.showEmptyPage("没有需要您确认的工单") { + pageIndex = 1 + obtainWorkOrderList() } + } else { + emptyView.hide() + notConfirmedAdapter = OrderNotConfirmedAdapter(requireContext(), dataBeans) + orderRecyclerView.adapter = notConfirmedAdapter + notConfirmedAdapter.setOnItemClickListener(object : + OrderNotConfirmedAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + val jobId = dataBeans[position].jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotProcessedFragment.kt b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotProcessedFragment.kt index a9c9878..4818538 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotProcessedFragment.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/fragment/order/NotProcessedFragment.kt @@ -13,6 +13,8 @@ import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter import com.pengxh.kt.lite.adapter.ViewHolder import com.pengxh.kt.lite.base.KotlinBaseFragment +import com.pengxh.kt.lite.divider.VerticalMarginItemDecoration +import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler @@ -68,8 +70,7 @@ val dataRows = it.data?.rows when { isRefresh -> { - dataBeans.clear() - dataBeans = dataRows!! + notProcessedAdapter.setRefreshData(dataRows!!) orderLayout.finishRefresh() isRefresh = false } @@ -77,17 +78,21 @@ if (dataRows?.size == 0) { "到底了,别拉了".show(requireContext()) } - dataBeans.addAll(dataRows!!) + notProcessedAdapter.setLoadMoreData(dataRows!!) orderLayout.finishLoadMore() isLoadMore = false } else -> { dataBeans = dataRows!! + weakReferenceHandler.sendEmptyMessage(2022111003) } } - weakReferenceHandler.sendEmptyMessage(2022111003) } } + + orderRecyclerView.addItemDecoration( + VerticalMarginItemDecoration(5f.dp2px(requireContext()), 0) + ) } override fun initEvent() { @@ -116,39 +121,33 @@ private val callback = Handler.Callback { if (it.what == 2022111003) { - if (isRefresh || isLoadMore) { - notProcessedAdapter.notifyDataSetChanged() - } else { //首次加载数据 - if (dataBeans.size == 0) { - emptyView!!.showEmptyPage("没有需要您处理的工单") { - pageIndex = 1 - obtainWorkOrderList() - } - } else { - emptyView!!.hide() - notProcessedAdapter = object : - NormalRecyclerAdapter( - R.layout.item_order_not_processed_rv, dataBeans - ) { - override fun convertView( - viewHolder: ViewHolder, - position: Int, - item: OrderListModel.DataBean.RowsBean - ) { - val alarmValue = if (item.alarmValue.toString().isBlank()) { - "报警值:未知" - } else { - "报警值:" + item.alarmValue - } - viewHolder.setText(R.id.alarmContentView, item.alarmContentName) - .setText(R.id.createTimeView, item.createTime) - .setText(R.id.wellCodeView, "点位编号:${item.wellCode}") - .setText(R.id.alarmValueView, alarmValue) - .setText(R.id.wellLocationView, "点位置:${item.position}") - - viewHolder.setOnClickListener( - R.id.operationButton, - object : View.OnClickListener { + if (dataBeans.size == 0) { + emptyView.showEmptyPage("没有需要您处理的工单") { + pageIndex = 1 + obtainWorkOrderList() + } + } else { + emptyView.hide() + notProcessedAdapter = object : + NormalRecyclerAdapter( + R.layout.item_order_not_processed_rv, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, position: Int, + item: OrderListModel.DataBean.RowsBean + ) { + val alarmValue = if (item.alarmValue.toString().isBlank()) { + "报警值:未知" + } else { + "报警值:" + item.alarmValue + } + viewHolder.setText(R.id.alarmContentView, item.alarmContentName) + .setText(R.id.createTimeView, item.createTime) + .setText(R.id.wellCodeView, "点位编号:${item.wellCode}") + .setText(R.id.alarmValueView, alarmValue) + .setText(R.id.wellLocationView, "点位置:${item.position}") + .setOnClickListener( + R.id.operationButton, object : View.OnClickListener { override fun onClick(v: View?) { //标记被点击的item位置 clickedPosition = position @@ -161,7 +160,7 @@ .setOnDialogButtonClickListener(object : AlertControlDialog.OnDialogButtonClickListener { override fun onConfirmClick() { - val jobId = dataBeans[position].jobId.toString() + val jobId = item.jobId.toString() if (jobId.isBlank()) { "工单ID异常,无法接单".show(requireContext()) return @@ -175,23 +174,22 @@ }).build().show() } }) - } } - orderRecyclerView!!.adapter = notProcessedAdapter - notProcessedAdapter.setOnItemClickedListener(object : - NormalRecyclerAdapter.OnItemClickedListener { - override fun onItemClicked( - position: Int, t: OrderListModel.DataBean.RowsBean - ) { - val jobId = t.jobId.toString() - if (jobId.isBlank()) { - "工单编号异常,无法查看详情".show(requireContext()) - return - } - requireContext().navigatePageTo(jobId) - } - }) } + orderRecyclerView.adapter = notProcessedAdapter + notProcessedAdapter.setOnItemClickedListener(object : + NormalRecyclerAdapter.OnItemClickedListener { + override fun onItemClicked( + position: Int, t: OrderListModel.DataBean.RowsBean + ) { + val jobId = t.jobId.toString() + if (jobId.isBlank()) { + "工单编号异常,无法查看详情".show(requireContext()) + return + } + requireContext().navigatePageTo(jobId) + } + }) } } true diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt index 6cb5d9c..614c656 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/CompletedDetailActivity.kt @@ -130,8 +130,7 @@ urls.add(path.combineImagePath()) } } - val imageAdapter = ReadOnlyImageAdapter(this) - imageAdapter.setImageList(urls) + val imageAdapter = ReadOnlyImageAdapter(this, urls) imageGridView.adapter = imageAdapter imageGridView.setOnItemClickListener { _, _, position, _ -> if (urls[position].isEmpty()) { diff --git a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt index bb2711a..83363e5 100644 --- a/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt +++ b/app/src/main/java/com/casic/smart/town/sanxi/view/order/InHandleDetailActivity.kt @@ -201,8 +201,7 @@ urls.add(path.combineImagePath()) } } - val imageAdapter = ReadOnlyImageAdapter(this) - imageAdapter.setImageList(urls) + val imageAdapter = ReadOnlyImageAdapter(this, urls) imageGridView.adapter = imageAdapter imageGridView.setOnItemClickListener { _, _, position, _ -> if (urls[position].isBlank()) { diff --git a/app/src/main/res/layout/fragment_order_completed.xml b/app/src/main/res/layout/fragment_order_completed.xml index 99c5a55..c43ac1a 100644 --- a/app/src/main/res/layout/fragment_order_completed.xml +++ b/app/src/main/res/layout/fragment_order_completed.xml @@ -11,25 +11,17 @@ + android:layout_height="match_parent"> - - - - + android:layout_height="wrap_content" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" /> + android:layout_height="match_parent"> - - - - + android:layout_height="wrap_content" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" /> + android:layout_height="match_parent"> - - - - + android:layout_height="wrap_content" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" /> + android:layout_height="match_parent"> - - - - + android:layout_height="wrap_content" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" /> diff --git a/app/src/main/res/layout/item_order_not_processed_rv.xml b/app/src/main/res/layout/item_order_not_processed_rv.xml index 29cd966..33138d4 100644 --- a/app/src/main/res/layout/item_order_not_processed_rv.xml +++ b/app/src/main/res/layout/item_order_not_processed_rv.xml @@ -3,8 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginHorizontal="@dimen/dp_10" - android:layout_marginBottom="@dimen/dp_10" + android:layout_marginHorizontal="@dimen/dp_5" android:background="@drawable/bg_solid_layout_white_radius_10" android:orientation="vertical" android:padding="@dimen/dp_5">