diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1f8fe29..00b0e47 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -28,6 +28,7 @@ + + +) : RecyclerView.Adapter() { + + private val layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_alarm_rv, parent, false) + ) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + + holder.groupNameView.text = rowsBean.projectName + holder.projectAreaView.text = rowsBean.area + holder.projectTypeView.text = rowsBean.type + holder.projectLocationView.text = rowsBean.location + + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var groupNameView: TextView = view.findViewById(R.id.groupNameView) + var projectAreaView: QMUIRoundButton = view.findViewById(R.id.projectAreaView) + var projectTypeView: QMUIRoundButton = view.findViewById(R.id.projectTypeView) + var projectLocationView: TextView = view.findViewById(R.id.projectLocationView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1f8fe29..00b0e47 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -28,6 +28,7 @@ + +) : RecyclerView.Adapter() { + + private val layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_alarm_rv, parent, false) + ) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + + holder.groupNameView.text = rowsBean.projectName + holder.projectAreaView.text = rowsBean.area + holder.projectTypeView.text = rowsBean.type + holder.projectLocationView.text = rowsBean.location + + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var groupNameView: TextView = view.findViewById(R.id.groupNameView) + var projectAreaView: QMUIRoundButton = view.findViewById(R.id.projectAreaView) + var projectTypeView: QMUIRoundButton = view.findViewById(R.id.projectTypeView) + var projectLocationView: TextView = view.findViewById(R.id.projectLocationView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt index 7e1faf3..c053c9c 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt @@ -8,12 +8,14 @@ import com.casic.br.operationsite.adapter.WorkingListAdapter import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.WorkingListModel +import com.casic.br.operationsite.utils.DialogHelper import com.casic.br.operationsite.view.WorkSiteTabActivity import com.casic.br.operationsite.vm.WorkSiteViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState import kotlinx.android.synthetic.main.fragment_working.* import kotlinx.android.synthetic.main.include_empty_view.* @@ -81,6 +83,19 @@ weakReferenceHandler.sendEmptyMessage(2022071101) } }) + + workSiteViewModel.loadState.observe(this, { + if (!isLoadMore && !isRefresh) { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + } + }) } private fun obtainWorkingListByPage() { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1f8fe29..00b0e47 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -28,6 +28,7 @@ + +) : RecyclerView.Adapter() { + + private val layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_alarm_rv, parent, false) + ) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + + holder.groupNameView.text = rowsBean.projectName + holder.projectAreaView.text = rowsBean.area + holder.projectTypeView.text = rowsBean.type + holder.projectLocationView.text = rowsBean.location + + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var groupNameView: TextView = view.findViewById(R.id.groupNameView) + var projectAreaView: QMUIRoundButton = view.findViewById(R.id.projectAreaView) + var projectTypeView: QMUIRoundButton = view.findViewById(R.id.projectTypeView) + var projectLocationView: TextView = view.findViewById(R.id.projectLocationView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt index 7e1faf3..c053c9c 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt @@ -8,12 +8,14 @@ import com.casic.br.operationsite.adapter.WorkingListAdapter import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.WorkingListModel +import com.casic.br.operationsite.utils.DialogHelper import com.casic.br.operationsite.view.WorkSiteTabActivity import com.casic.br.operationsite.vm.WorkSiteViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState import kotlinx.android.synthetic.main.fragment_working.* import kotlinx.android.synthetic.main.include_empty_view.* @@ -81,6 +83,19 @@ weakReferenceHandler.sendEmptyMessage(2022071101) } }) + + workSiteViewModel.loadState.observe(this, { + if (!isLoadMore && !isRefresh) { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + } + }) } private fun obtainWorkingListByPage() { diff --git a/app/src/main/java/com/casic/br/operationsite/model/AlarmListModel.java b/app/src/main/java/com/casic/br/operationsite/model/AlarmListModel.java new file mode 100644 index 0000000..7979a74 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/model/AlarmListModel.java @@ -0,0 +1,121 @@ +package com.casic.br.operationsite.model; + +import java.util.List; + +public class AlarmListModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsBean { + private String area; + private String createTime; + private String id; + private String location; + private String projectName; + private String type; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } + + public String getProjectName() { + return projectName; + } + + public void setProjectName(String projectName) { + this.projectName = projectName; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + } + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1f8fe29..00b0e47 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -28,6 +28,7 @@ + +) : RecyclerView.Adapter() { + + private val layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_alarm_rv, parent, false) + ) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + + holder.groupNameView.text = rowsBean.projectName + holder.projectAreaView.text = rowsBean.area + holder.projectTypeView.text = rowsBean.type + holder.projectLocationView.text = rowsBean.location + + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var groupNameView: TextView = view.findViewById(R.id.groupNameView) + var projectAreaView: QMUIRoundButton = view.findViewById(R.id.projectAreaView) + var projectTypeView: QMUIRoundButton = view.findViewById(R.id.projectTypeView) + var projectLocationView: TextView = view.findViewById(R.id.projectLocationView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt index 7e1faf3..c053c9c 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt @@ -8,12 +8,14 @@ import com.casic.br.operationsite.adapter.WorkingListAdapter import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.WorkingListModel +import com.casic.br.operationsite.utils.DialogHelper import com.casic.br.operationsite.view.WorkSiteTabActivity import com.casic.br.operationsite.vm.WorkSiteViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState import kotlinx.android.synthetic.main.fragment_working.* import kotlinx.android.synthetic.main.include_empty_view.* @@ -81,6 +83,19 @@ weakReferenceHandler.sendEmptyMessage(2022071101) } }) + + workSiteViewModel.loadState.observe(this, { + if (!isLoadMore && !isRefresh) { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + } + }) } private fun obtainWorkingListByPage() { diff --git a/app/src/main/java/com/casic/br/operationsite/model/AlarmListModel.java b/app/src/main/java/com/casic/br/operationsite/model/AlarmListModel.java new file mode 100644 index 0000000..7979a74 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/model/AlarmListModel.java @@ -0,0 +1,121 @@ +package com.casic.br.operationsite.model; + +import java.util.List; + +public class AlarmListModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsBean { + private String area; + private String createTime; + private String id; + private String location; + private String projectName; + private String type; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } + + public String getProjectName() { + return projectName; + } + + public void setProjectName(String projectName) { + this.projectName = projectName; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt index b7e8188..e034eba 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt @@ -12,4 +12,13 @@ @Query("offset") offset: Int, @Query("limit") limit: Int ): String + + /** + * 报警列表 + */ + @GET("/test/alarm/alarmList") + suspend fun obtainAlarmListByPage( + @Query("offset") offset: Int, + @Query("limit") limit: Int + ): String } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1f8fe29..00b0e47 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -28,6 +28,7 @@ + +) : RecyclerView.Adapter() { + + private val layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_alarm_rv, parent, false) + ) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + + holder.groupNameView.text = rowsBean.projectName + holder.projectAreaView.text = rowsBean.area + holder.projectTypeView.text = rowsBean.type + holder.projectLocationView.text = rowsBean.location + + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var groupNameView: TextView = view.findViewById(R.id.groupNameView) + var projectAreaView: QMUIRoundButton = view.findViewById(R.id.projectAreaView) + var projectTypeView: QMUIRoundButton = view.findViewById(R.id.projectTypeView) + var projectLocationView: TextView = view.findViewById(R.id.projectLocationView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt index 7e1faf3..c053c9c 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt @@ -8,12 +8,14 @@ import com.casic.br.operationsite.adapter.WorkingListAdapter import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.WorkingListModel +import com.casic.br.operationsite.utils.DialogHelper import com.casic.br.operationsite.view.WorkSiteTabActivity import com.casic.br.operationsite.vm.WorkSiteViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState import kotlinx.android.synthetic.main.fragment_working.* import kotlinx.android.synthetic.main.include_empty_view.* @@ -81,6 +83,19 @@ weakReferenceHandler.sendEmptyMessage(2022071101) } }) + + workSiteViewModel.loadState.observe(this, { + if (!isLoadMore && !isRefresh) { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + } + }) } private fun obtainWorkingListByPage() { diff --git a/app/src/main/java/com/casic/br/operationsite/model/AlarmListModel.java b/app/src/main/java/com/casic/br/operationsite/model/AlarmListModel.java new file mode 100644 index 0000000..7979a74 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/model/AlarmListModel.java @@ -0,0 +1,121 @@ +package com.casic.br.operationsite.model; + +import java.util.List; + +public class AlarmListModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsBean { + private String area; + private String createTime; + private String id; + private String location; + private String projectName; + private String type; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } + + public String getProjectName() { + return projectName; + } + + public void setProjectName(String projectName) { + this.projectName = projectName; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt index b7e8188..e034eba 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt @@ -12,4 +12,13 @@ @Query("offset") offset: Int, @Query("limit") limit: Int ): String + + /** + * 报警列表 + */ + @GET("/test/alarm/alarmList") + suspend fun obtainAlarmListByPage( + @Query("offset") offset: Int, + @Query("limit") limit: Int + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 63c4f5c..209bc31 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -19,4 +19,11 @@ suspend fun obtainWorkingListByPage(page: Int): String { return api.obtainWorkingListByPage(page, LocaleConstant.PAGE_LIMIT) } + + /** + * 报警列表 + */ + suspend fun obtainAlarmListByPage(page: Int): String { + return api.obtainAlarmListByPage(page, LocaleConstant.PAGE_LIMIT) + } } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1f8fe29..00b0e47 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -28,6 +28,7 @@ + +) : RecyclerView.Adapter() { + + private val layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_alarm_rv, parent, false) + ) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + + holder.groupNameView.text = rowsBean.projectName + holder.projectAreaView.text = rowsBean.area + holder.projectTypeView.text = rowsBean.type + holder.projectLocationView.text = rowsBean.location + + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var groupNameView: TextView = view.findViewById(R.id.groupNameView) + var projectAreaView: QMUIRoundButton = view.findViewById(R.id.projectAreaView) + var projectTypeView: QMUIRoundButton = view.findViewById(R.id.projectTypeView) + var projectLocationView: TextView = view.findViewById(R.id.projectLocationView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt index 7e1faf3..c053c9c 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt @@ -8,12 +8,14 @@ import com.casic.br.operationsite.adapter.WorkingListAdapter import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.WorkingListModel +import com.casic.br.operationsite.utils.DialogHelper import com.casic.br.operationsite.view.WorkSiteTabActivity import com.casic.br.operationsite.vm.WorkSiteViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState import kotlinx.android.synthetic.main.fragment_working.* import kotlinx.android.synthetic.main.include_empty_view.* @@ -81,6 +83,19 @@ weakReferenceHandler.sendEmptyMessage(2022071101) } }) + + workSiteViewModel.loadState.observe(this, { + if (!isLoadMore && !isRefresh) { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + } + }) } private fun obtainWorkingListByPage() { diff --git a/app/src/main/java/com/casic/br/operationsite/model/AlarmListModel.java b/app/src/main/java/com/casic/br/operationsite/model/AlarmListModel.java new file mode 100644 index 0000000..7979a74 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/model/AlarmListModel.java @@ -0,0 +1,121 @@ +package com.casic.br.operationsite.model; + +import java.util.List; + +public class AlarmListModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsBean { + private String area; + private String createTime; + private String id; + private String location; + private String projectName; + private String type; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } + + public String getProjectName() { + return projectName; + } + + public void setProjectName(String projectName) { + this.projectName = projectName; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt index b7e8188..e034eba 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt @@ -12,4 +12,13 @@ @Query("offset") offset: Int, @Query("limit") limit: Int ): String + + /** + * 报警列表 + */ + @GET("/test/alarm/alarmList") + suspend fun obtainAlarmListByPage( + @Query("offset") offset: Int, + @Query("limit") limit: Int + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 63c4f5c..209bc31 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -19,4 +19,11 @@ suspend fun obtainWorkingListByPage(page: Int): String { return api.obtainWorkingListByPage(page, LocaleConstant.PAGE_LIMIT) } + + /** + * 报警列表 + */ + suspend fun obtainAlarmListByPage(page: Int): String { + return api.obtainAlarmListByPage(page, LocaleConstant.PAGE_LIMIT) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/utils/DialogHelper.kt b/app/src/main/java/com/casic/br/operationsite/utils/DialogHelper.kt new file mode 100644 index 0000000..751d8ce --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/utils/DialogHelper.kt @@ -0,0 +1,29 @@ +package com.casic.br.operationsite.utils; + +import android.app.Activity +import android.view.WindowManager +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + +object DialogHelper { + private lateinit var loadingDialog: QMUITipDialog + + fun showLoadingDialog(activity: Activity, message: String?) { + loadingDialog = QMUITipDialog.Builder(activity) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord(message) + .create() + if (!activity.isDestroyed) { + try { + loadingDialog.show() + } catch (e: WindowManager.BadTokenException) { + e.printStackTrace() + } + } + } + + fun dismissLoadingDialog() { + if (loadingDialog.isShowing) { + loadingDialog.dismiss() + } + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1f8fe29..00b0e47 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -28,6 +28,7 @@ + +) : RecyclerView.Adapter() { + + private val layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_alarm_rv, parent, false) + ) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + + holder.groupNameView.text = rowsBean.projectName + holder.projectAreaView.text = rowsBean.area + holder.projectTypeView.text = rowsBean.type + holder.projectLocationView.text = rowsBean.location + + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var groupNameView: TextView = view.findViewById(R.id.groupNameView) + var projectAreaView: QMUIRoundButton = view.findViewById(R.id.projectAreaView) + var projectTypeView: QMUIRoundButton = view.findViewById(R.id.projectTypeView) + var projectLocationView: TextView = view.findViewById(R.id.projectLocationView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt index 7e1faf3..c053c9c 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt @@ -8,12 +8,14 @@ import com.casic.br.operationsite.adapter.WorkingListAdapter import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.WorkingListModel +import com.casic.br.operationsite.utils.DialogHelper import com.casic.br.operationsite.view.WorkSiteTabActivity import com.casic.br.operationsite.vm.WorkSiteViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState import kotlinx.android.synthetic.main.fragment_working.* import kotlinx.android.synthetic.main.include_empty_view.* @@ -81,6 +83,19 @@ weakReferenceHandler.sendEmptyMessage(2022071101) } }) + + workSiteViewModel.loadState.observe(this, { + if (!isLoadMore && !isRefresh) { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + } + }) } private fun obtainWorkingListByPage() { diff --git a/app/src/main/java/com/casic/br/operationsite/model/AlarmListModel.java b/app/src/main/java/com/casic/br/operationsite/model/AlarmListModel.java new file mode 100644 index 0000000..7979a74 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/model/AlarmListModel.java @@ -0,0 +1,121 @@ +package com.casic.br.operationsite.model; + +import java.util.List; + +public class AlarmListModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsBean { + private String area; + private String createTime; + private String id; + private String location; + private String projectName; + private String type; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } + + public String getProjectName() { + return projectName; + } + + public void setProjectName(String projectName) { + this.projectName = projectName; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt index b7e8188..e034eba 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt @@ -12,4 +12,13 @@ @Query("offset") offset: Int, @Query("limit") limit: Int ): String + + /** + * 报警列表 + */ + @GET("/test/alarm/alarmList") + suspend fun obtainAlarmListByPage( + @Query("offset") offset: Int, + @Query("limit") limit: Int + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 63c4f5c..209bc31 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -19,4 +19,11 @@ suspend fun obtainWorkingListByPage(page: Int): String { return api.obtainWorkingListByPage(page, LocaleConstant.PAGE_LIMIT) } + + /** + * 报警列表 + */ + suspend fun obtainAlarmListByPage(page: Int): String { + return api.obtainAlarmListByPage(page, LocaleConstant.PAGE_LIMIT) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/utils/DialogHelper.kt b/app/src/main/java/com/casic/br/operationsite/utils/DialogHelper.kt new file mode 100644 index 0000000..751d8ce --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/utils/DialogHelper.kt @@ -0,0 +1,29 @@ +package com.casic.br.operationsite.utils; + +import android.app.Activity +import android.view.WindowManager +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + +object DialogHelper { + private lateinit var loadingDialog: QMUITipDialog + + fun showLoadingDialog(activity: Activity, message: String?) { + loadingDialog = QMUITipDialog.Builder(activity) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord(message) + .create() + if (!activity.isDestroyed) { + try { + loadingDialog.show() + } catch (e: WindowManager.BadTokenException) { + e.printStackTrace() + } + } + } + + fun dismissLoadingDialog() { + if (loadingDialog.isShowing) { + loadingDialog.dismiss() + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt new file mode 100644 index 0000000..d6594c7 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.operationsite.view + +import android.os.Handler +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.br.operationsite.R +import com.casic.br.operationsite.adapter.AlarmListAdapter +import com.casic.br.operationsite.extensions.showEmptyPage +import com.casic.br.operationsite.model.AlarmListModel +import com.casic.br.operationsite.utils.DialogHelper +import com.casic.br.operationsite.vm.AlarmViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_alarm_list.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class AlarmListActivity : KotlinBaseActivity() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var alarmListAdapter: AlarmListAdapter + private lateinit var alarmViewModel: AlarmViewModel + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initLayoutView(): Int = R.layout.activity_alarm_list + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) + + searchTextView.setOnClickListener { + if (searchInputView.text.isNullOrBlank()) { + "错误!请重新输入!".show(this) + } + } + } + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) + alarmViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + } + + override fun onResume() { + obtainAlarmListByPage() + super.onResume() + } + + override fun initEvent() { + alarmRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainAlarmListByPage() + } + alarmRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainAlarmListByPage() + } + + alarmViewModel.alarmModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + alarmRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows!!) + alarmRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022071201) + } + }) + + alarmViewModel.loadState.observe(this, { + if (!isLoadMore && !isRefresh) { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + } + }) + } + + private fun obtainAlarmListByPage() { + alarmViewModel.obtainAlarmListByPage(pageIndex) + } + + private val callback = Handler.Callback { + if (it.what == 2022071201) { + if (isRefresh || isLoadMore) { + alarmListAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage { + pageIndex = 1 + obtainAlarmListByPage() + } + } else { + emptyView!!.hide() + alarmListAdapter = AlarmListAdapter(this, dataBeans) + alarmRecyclerView!!.addItemDecoration( + DividerItemDecoration(this, DividerItemDecoration.VERTICAL) + ) + alarmRecyclerView!!.layoutManager = LinearLayoutManager(this) + alarmRecyclerView!!.adapter = alarmListAdapter + alarmListAdapter.setOnItemClickListener(object : + AlarmListAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + navigatePageTo(dataBeans[position].id) + } + }) + } + } + } + true + } + + /** + * xml申明式点击事件 + * @param view 事件持有者,不可删除 + * */ + fun finishActivity(view: View) { + finish() + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1f8fe29..00b0e47 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -28,6 +28,7 @@ + +) : RecyclerView.Adapter() { + + private val layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_alarm_rv, parent, false) + ) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + + holder.groupNameView.text = rowsBean.projectName + holder.projectAreaView.text = rowsBean.area + holder.projectTypeView.text = rowsBean.type + holder.projectLocationView.text = rowsBean.location + + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var groupNameView: TextView = view.findViewById(R.id.groupNameView) + var projectAreaView: QMUIRoundButton = view.findViewById(R.id.projectAreaView) + var projectTypeView: QMUIRoundButton = view.findViewById(R.id.projectTypeView) + var projectLocationView: TextView = view.findViewById(R.id.projectLocationView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt index 7e1faf3..c053c9c 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt @@ -8,12 +8,14 @@ import com.casic.br.operationsite.adapter.WorkingListAdapter import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.WorkingListModel +import com.casic.br.operationsite.utils.DialogHelper import com.casic.br.operationsite.view.WorkSiteTabActivity import com.casic.br.operationsite.vm.WorkSiteViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState import kotlinx.android.synthetic.main.fragment_working.* import kotlinx.android.synthetic.main.include_empty_view.* @@ -81,6 +83,19 @@ weakReferenceHandler.sendEmptyMessage(2022071101) } }) + + workSiteViewModel.loadState.observe(this, { + if (!isLoadMore && !isRefresh) { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + } + }) } private fun obtainWorkingListByPage() { diff --git a/app/src/main/java/com/casic/br/operationsite/model/AlarmListModel.java b/app/src/main/java/com/casic/br/operationsite/model/AlarmListModel.java new file mode 100644 index 0000000..7979a74 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/model/AlarmListModel.java @@ -0,0 +1,121 @@ +package com.casic.br.operationsite.model; + +import java.util.List; + +public class AlarmListModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsBean { + private String area; + private String createTime; + private String id; + private String location; + private String projectName; + private String type; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } + + public String getProjectName() { + return projectName; + } + + public void setProjectName(String projectName) { + this.projectName = projectName; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt index b7e8188..e034eba 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt @@ -12,4 +12,13 @@ @Query("offset") offset: Int, @Query("limit") limit: Int ): String + + /** + * 报警列表 + */ + @GET("/test/alarm/alarmList") + suspend fun obtainAlarmListByPage( + @Query("offset") offset: Int, + @Query("limit") limit: Int + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 63c4f5c..209bc31 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -19,4 +19,11 @@ suspend fun obtainWorkingListByPage(page: Int): String { return api.obtainWorkingListByPage(page, LocaleConstant.PAGE_LIMIT) } + + /** + * 报警列表 + */ + suspend fun obtainAlarmListByPage(page: Int): String { + return api.obtainAlarmListByPage(page, LocaleConstant.PAGE_LIMIT) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/utils/DialogHelper.kt b/app/src/main/java/com/casic/br/operationsite/utils/DialogHelper.kt new file mode 100644 index 0000000..751d8ce --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/utils/DialogHelper.kt @@ -0,0 +1,29 @@ +package com.casic.br.operationsite.utils; + +import android.app.Activity +import android.view.WindowManager +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + +object DialogHelper { + private lateinit var loadingDialog: QMUITipDialog + + fun showLoadingDialog(activity: Activity, message: String?) { + loadingDialog = QMUITipDialog.Builder(activity) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord(message) + .create() + if (!activity.isDestroyed) { + try { + loadingDialog.show() + } catch (e: WindowManager.BadTokenException) { + e.printStackTrace() + } + } + } + + fun dismissLoadingDialog() { + if (loadingDialog.isShowing) { + loadingDialog.dismiss() + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt new file mode 100644 index 0000000..d6594c7 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.operationsite.view + +import android.os.Handler +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.br.operationsite.R +import com.casic.br.operationsite.adapter.AlarmListAdapter +import com.casic.br.operationsite.extensions.showEmptyPage +import com.casic.br.operationsite.model.AlarmListModel +import com.casic.br.operationsite.utils.DialogHelper +import com.casic.br.operationsite.vm.AlarmViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_alarm_list.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class AlarmListActivity : KotlinBaseActivity() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var alarmListAdapter: AlarmListAdapter + private lateinit var alarmViewModel: AlarmViewModel + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initLayoutView(): Int = R.layout.activity_alarm_list + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) + + searchTextView.setOnClickListener { + if (searchInputView.text.isNullOrBlank()) { + "错误!请重新输入!".show(this) + } + } + } + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) + alarmViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + } + + override fun onResume() { + obtainAlarmListByPage() + super.onResume() + } + + override fun initEvent() { + alarmRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainAlarmListByPage() + } + alarmRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainAlarmListByPage() + } + + alarmViewModel.alarmModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + alarmRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows!!) + alarmRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022071201) + } + }) + + alarmViewModel.loadState.observe(this, { + if (!isLoadMore && !isRefresh) { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + } + }) + } + + private fun obtainAlarmListByPage() { + alarmViewModel.obtainAlarmListByPage(pageIndex) + } + + private val callback = Handler.Callback { + if (it.what == 2022071201) { + if (isRefresh || isLoadMore) { + alarmListAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage { + pageIndex = 1 + obtainAlarmListByPage() + } + } else { + emptyView!!.hide() + alarmListAdapter = AlarmListAdapter(this, dataBeans) + alarmRecyclerView!!.addItemDecoration( + DividerItemDecoration(this, DividerItemDecoration.VERTICAL) + ) + alarmRecyclerView!!.layoutManager = LinearLayoutManager(this) + alarmRecyclerView!!.adapter = alarmListAdapter + alarmListAdapter.setOnItemClickListener(object : + AlarmListAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + navigatePageTo(dataBeans[position].id) + } + }) + } + } + } + true + } + + /** + * xml申明式点击事件 + * @param view 事件持有者,不可删除 + * */ + fun finishActivity(view: View) { + finish() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt index bea8faa..1cf2a04 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt @@ -81,7 +81,7 @@ override fun initEvent() { alarmTextView.setOnClickListener { - navigatePageTo() + navigatePageTo() } fenceTextView.setOnClickListener { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1f8fe29..00b0e47 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -28,6 +28,7 @@ + +) : RecyclerView.Adapter() { + + private val layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_alarm_rv, parent, false) + ) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + + holder.groupNameView.text = rowsBean.projectName + holder.projectAreaView.text = rowsBean.area + holder.projectTypeView.text = rowsBean.type + holder.projectLocationView.text = rowsBean.location + + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var groupNameView: TextView = view.findViewById(R.id.groupNameView) + var projectAreaView: QMUIRoundButton = view.findViewById(R.id.projectAreaView) + var projectTypeView: QMUIRoundButton = view.findViewById(R.id.projectTypeView) + var projectLocationView: TextView = view.findViewById(R.id.projectLocationView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt index 7e1faf3..c053c9c 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt @@ -8,12 +8,14 @@ import com.casic.br.operationsite.adapter.WorkingListAdapter import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.WorkingListModel +import com.casic.br.operationsite.utils.DialogHelper import com.casic.br.operationsite.view.WorkSiteTabActivity import com.casic.br.operationsite.vm.WorkSiteViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState import kotlinx.android.synthetic.main.fragment_working.* import kotlinx.android.synthetic.main.include_empty_view.* @@ -81,6 +83,19 @@ weakReferenceHandler.sendEmptyMessage(2022071101) } }) + + workSiteViewModel.loadState.observe(this, { + if (!isLoadMore && !isRefresh) { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + } + }) } private fun obtainWorkingListByPage() { diff --git a/app/src/main/java/com/casic/br/operationsite/model/AlarmListModel.java b/app/src/main/java/com/casic/br/operationsite/model/AlarmListModel.java new file mode 100644 index 0000000..7979a74 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/model/AlarmListModel.java @@ -0,0 +1,121 @@ +package com.casic.br.operationsite.model; + +import java.util.List; + +public class AlarmListModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsBean { + private String area; + private String createTime; + private String id; + private String location; + private String projectName; + private String type; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } + + public String getProjectName() { + return projectName; + } + + public void setProjectName(String projectName) { + this.projectName = projectName; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt index b7e8188..e034eba 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt @@ -12,4 +12,13 @@ @Query("offset") offset: Int, @Query("limit") limit: Int ): String + + /** + * 报警列表 + */ + @GET("/test/alarm/alarmList") + suspend fun obtainAlarmListByPage( + @Query("offset") offset: Int, + @Query("limit") limit: Int + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 63c4f5c..209bc31 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -19,4 +19,11 @@ suspend fun obtainWorkingListByPage(page: Int): String { return api.obtainWorkingListByPage(page, LocaleConstant.PAGE_LIMIT) } + + /** + * 报警列表 + */ + suspend fun obtainAlarmListByPage(page: Int): String { + return api.obtainAlarmListByPage(page, LocaleConstant.PAGE_LIMIT) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/utils/DialogHelper.kt b/app/src/main/java/com/casic/br/operationsite/utils/DialogHelper.kt new file mode 100644 index 0000000..751d8ce --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/utils/DialogHelper.kt @@ -0,0 +1,29 @@ +package com.casic.br.operationsite.utils; + +import android.app.Activity +import android.view.WindowManager +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + +object DialogHelper { + private lateinit var loadingDialog: QMUITipDialog + + fun showLoadingDialog(activity: Activity, message: String?) { + loadingDialog = QMUITipDialog.Builder(activity) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord(message) + .create() + if (!activity.isDestroyed) { + try { + loadingDialog.show() + } catch (e: WindowManager.BadTokenException) { + e.printStackTrace() + } + } + } + + fun dismissLoadingDialog() { + if (loadingDialog.isShowing) { + loadingDialog.dismiss() + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt new file mode 100644 index 0000000..d6594c7 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.operationsite.view + +import android.os.Handler +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.br.operationsite.R +import com.casic.br.operationsite.adapter.AlarmListAdapter +import com.casic.br.operationsite.extensions.showEmptyPage +import com.casic.br.operationsite.model.AlarmListModel +import com.casic.br.operationsite.utils.DialogHelper +import com.casic.br.operationsite.vm.AlarmViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_alarm_list.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class AlarmListActivity : KotlinBaseActivity() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var alarmListAdapter: AlarmListAdapter + private lateinit var alarmViewModel: AlarmViewModel + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initLayoutView(): Int = R.layout.activity_alarm_list + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) + + searchTextView.setOnClickListener { + if (searchInputView.text.isNullOrBlank()) { + "错误!请重新输入!".show(this) + } + } + } + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) + alarmViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + } + + override fun onResume() { + obtainAlarmListByPage() + super.onResume() + } + + override fun initEvent() { + alarmRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainAlarmListByPage() + } + alarmRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainAlarmListByPage() + } + + alarmViewModel.alarmModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + alarmRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows!!) + alarmRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022071201) + } + }) + + alarmViewModel.loadState.observe(this, { + if (!isLoadMore && !isRefresh) { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + } + }) + } + + private fun obtainAlarmListByPage() { + alarmViewModel.obtainAlarmListByPage(pageIndex) + } + + private val callback = Handler.Callback { + if (it.what == 2022071201) { + if (isRefresh || isLoadMore) { + alarmListAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage { + pageIndex = 1 + obtainAlarmListByPage() + } + } else { + emptyView!!.hide() + alarmListAdapter = AlarmListAdapter(this, dataBeans) + alarmRecyclerView!!.addItemDecoration( + DividerItemDecoration(this, DividerItemDecoration.VERTICAL) + ) + alarmRecyclerView!!.layoutManager = LinearLayoutManager(this) + alarmRecyclerView!!.adapter = alarmListAdapter + alarmListAdapter.setOnItemClickListener(object : + AlarmListAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + navigatePageTo(dataBeans[position].id) + } + }) + } + } + } + true + } + + /** + * xml申明式点击事件 + * @param view 事件持有者,不可删除 + * */ + fun finishActivity(view: View) { + finish() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt index bea8faa..1cf2a04 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt @@ -81,7 +81,7 @@ override fun initEvent() { alarmTextView.setOnClickListener { - navigatePageTo() + navigatePageTo() } fenceTextView.setOnClickListener { diff --git a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt new file mode 100644 index 0000000..f438b3b --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt @@ -0,0 +1,37 @@ +package com.casic.br.operationsite.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.br.operationsite.base.BaseApplication +import com.casic.br.operationsite.extensions.separateResponseCode +import com.casic.br.operationsite.extensions.toErrorMessage +import com.casic.br.operationsite.model.AlarmListModel +import com.casic.br.operationsite.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState + +class AlarmViewModel : BaseViewModel() { + + private val gson = Gson() + val alarmModel = MutableLiveData() + + fun obtainAlarmListByPage(page: Int) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainAlarmListByPage(page) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + alarmModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + loadState.value = LoadState.Success + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1f8fe29..00b0e47 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -28,6 +28,7 @@ + +) : RecyclerView.Adapter() { + + private val layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_alarm_rv, parent, false) + ) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + + holder.groupNameView.text = rowsBean.projectName + holder.projectAreaView.text = rowsBean.area + holder.projectTypeView.text = rowsBean.type + holder.projectLocationView.text = rowsBean.location + + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var groupNameView: TextView = view.findViewById(R.id.groupNameView) + var projectAreaView: QMUIRoundButton = view.findViewById(R.id.projectAreaView) + var projectTypeView: QMUIRoundButton = view.findViewById(R.id.projectTypeView) + var projectLocationView: TextView = view.findViewById(R.id.projectLocationView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt index 7e1faf3..c053c9c 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt @@ -8,12 +8,14 @@ import com.casic.br.operationsite.adapter.WorkingListAdapter import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.WorkingListModel +import com.casic.br.operationsite.utils.DialogHelper import com.casic.br.operationsite.view.WorkSiteTabActivity import com.casic.br.operationsite.vm.WorkSiteViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState import kotlinx.android.synthetic.main.fragment_working.* import kotlinx.android.synthetic.main.include_empty_view.* @@ -81,6 +83,19 @@ weakReferenceHandler.sendEmptyMessage(2022071101) } }) + + workSiteViewModel.loadState.observe(this, { + if (!isLoadMore && !isRefresh) { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + } + }) } private fun obtainWorkingListByPage() { diff --git a/app/src/main/java/com/casic/br/operationsite/model/AlarmListModel.java b/app/src/main/java/com/casic/br/operationsite/model/AlarmListModel.java new file mode 100644 index 0000000..7979a74 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/model/AlarmListModel.java @@ -0,0 +1,121 @@ +package com.casic.br.operationsite.model; + +import java.util.List; + +public class AlarmListModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsBean { + private String area; + private String createTime; + private String id; + private String location; + private String projectName; + private String type; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } + + public String getProjectName() { + return projectName; + } + + public void setProjectName(String projectName) { + this.projectName = projectName; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt index b7e8188..e034eba 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt @@ -12,4 +12,13 @@ @Query("offset") offset: Int, @Query("limit") limit: Int ): String + + /** + * 报警列表 + */ + @GET("/test/alarm/alarmList") + suspend fun obtainAlarmListByPage( + @Query("offset") offset: Int, + @Query("limit") limit: Int + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 63c4f5c..209bc31 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -19,4 +19,11 @@ suspend fun obtainWorkingListByPage(page: Int): String { return api.obtainWorkingListByPage(page, LocaleConstant.PAGE_LIMIT) } + + /** + * 报警列表 + */ + suspend fun obtainAlarmListByPage(page: Int): String { + return api.obtainAlarmListByPage(page, LocaleConstant.PAGE_LIMIT) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/utils/DialogHelper.kt b/app/src/main/java/com/casic/br/operationsite/utils/DialogHelper.kt new file mode 100644 index 0000000..751d8ce --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/utils/DialogHelper.kt @@ -0,0 +1,29 @@ +package com.casic.br.operationsite.utils; + +import android.app.Activity +import android.view.WindowManager +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + +object DialogHelper { + private lateinit var loadingDialog: QMUITipDialog + + fun showLoadingDialog(activity: Activity, message: String?) { + loadingDialog = QMUITipDialog.Builder(activity) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord(message) + .create() + if (!activity.isDestroyed) { + try { + loadingDialog.show() + } catch (e: WindowManager.BadTokenException) { + e.printStackTrace() + } + } + } + + fun dismissLoadingDialog() { + if (loadingDialog.isShowing) { + loadingDialog.dismiss() + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt new file mode 100644 index 0000000..d6594c7 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.operationsite.view + +import android.os.Handler +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.br.operationsite.R +import com.casic.br.operationsite.adapter.AlarmListAdapter +import com.casic.br.operationsite.extensions.showEmptyPage +import com.casic.br.operationsite.model.AlarmListModel +import com.casic.br.operationsite.utils.DialogHelper +import com.casic.br.operationsite.vm.AlarmViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_alarm_list.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class AlarmListActivity : KotlinBaseActivity() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var alarmListAdapter: AlarmListAdapter + private lateinit var alarmViewModel: AlarmViewModel + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initLayoutView(): Int = R.layout.activity_alarm_list + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) + + searchTextView.setOnClickListener { + if (searchInputView.text.isNullOrBlank()) { + "错误!请重新输入!".show(this) + } + } + } + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) + alarmViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + } + + override fun onResume() { + obtainAlarmListByPage() + super.onResume() + } + + override fun initEvent() { + alarmRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainAlarmListByPage() + } + alarmRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainAlarmListByPage() + } + + alarmViewModel.alarmModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + alarmRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows!!) + alarmRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022071201) + } + }) + + alarmViewModel.loadState.observe(this, { + if (!isLoadMore && !isRefresh) { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + } + }) + } + + private fun obtainAlarmListByPage() { + alarmViewModel.obtainAlarmListByPage(pageIndex) + } + + private val callback = Handler.Callback { + if (it.what == 2022071201) { + if (isRefresh || isLoadMore) { + alarmListAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage { + pageIndex = 1 + obtainAlarmListByPage() + } + } else { + emptyView!!.hide() + alarmListAdapter = AlarmListAdapter(this, dataBeans) + alarmRecyclerView!!.addItemDecoration( + DividerItemDecoration(this, DividerItemDecoration.VERTICAL) + ) + alarmRecyclerView!!.layoutManager = LinearLayoutManager(this) + alarmRecyclerView!!.adapter = alarmListAdapter + alarmListAdapter.setOnItemClickListener(object : + AlarmListAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + navigatePageTo(dataBeans[position].id) + } + }) + } + } + } + true + } + + /** + * xml申明式点击事件 + * @param view 事件持有者,不可删除 + * */ + fun finishActivity(view: View) { + finish() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt index bea8faa..1cf2a04 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt @@ -81,7 +81,7 @@ override fun initEvent() { alarmTextView.setOnClickListener { - navigatePageTo() + navigatePageTo() } fenceTextView.setOnClickListener { diff --git a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt new file mode 100644 index 0000000..f438b3b --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt @@ -0,0 +1,37 @@ +package com.casic.br.operationsite.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.br.operationsite.base.BaseApplication +import com.casic.br.operationsite.extensions.separateResponseCode +import com.casic.br.operationsite.extensions.toErrorMessage +import com.casic.br.operationsite.model.AlarmListModel +import com.casic.br.operationsite.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState + +class AlarmViewModel : BaseViewModel() { + + private val gson = Gson() + val alarmModel = MutableLiveData() + + fun obtainAlarmListByPage(page: Int) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainAlarmListByPage(page) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + alarmModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + loadState.value = LoadState.Success + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/WorkSiteViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/WorkSiteViewModel.kt index ab0d764..d5d8601 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/WorkSiteViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/WorkSiteViewModel.kt @@ -11,6 +11,7 @@ import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState /** * 现场作业ViewModel @@ -21,13 +22,16 @@ val workingModel = MutableLiveData() fun obtainWorkingListByPage(page: Int) = launch({ + loadState.value = LoadState.Loading val response = RetrofitServiceManager.obtainWorkingListByPage(page) val responseCode = response.separateResponseCode() if (responseCode == 200) { workingModel.value = gson.fromJson( response, object : TypeToken() {}.type ) + loadState.value = LoadState.Success } else { + loadState.value = LoadState.Fail response.toErrorMessage().show(BaseApplication.obtainInstance()) } }, { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1f8fe29..00b0e47 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -28,6 +28,7 @@ + +) : RecyclerView.Adapter() { + + private val layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_alarm_rv, parent, false) + ) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + + holder.groupNameView.text = rowsBean.projectName + holder.projectAreaView.text = rowsBean.area + holder.projectTypeView.text = rowsBean.type + holder.projectLocationView.text = rowsBean.location + + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var groupNameView: TextView = view.findViewById(R.id.groupNameView) + var projectAreaView: QMUIRoundButton = view.findViewById(R.id.projectAreaView) + var projectTypeView: QMUIRoundButton = view.findViewById(R.id.projectTypeView) + var projectLocationView: TextView = view.findViewById(R.id.projectLocationView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt index 7e1faf3..c053c9c 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt @@ -8,12 +8,14 @@ import com.casic.br.operationsite.adapter.WorkingListAdapter import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.WorkingListModel +import com.casic.br.operationsite.utils.DialogHelper import com.casic.br.operationsite.view.WorkSiteTabActivity import com.casic.br.operationsite.vm.WorkSiteViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState import kotlinx.android.synthetic.main.fragment_working.* import kotlinx.android.synthetic.main.include_empty_view.* @@ -81,6 +83,19 @@ weakReferenceHandler.sendEmptyMessage(2022071101) } }) + + workSiteViewModel.loadState.observe(this, { + if (!isLoadMore && !isRefresh) { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + } + }) } private fun obtainWorkingListByPage() { diff --git a/app/src/main/java/com/casic/br/operationsite/model/AlarmListModel.java b/app/src/main/java/com/casic/br/operationsite/model/AlarmListModel.java new file mode 100644 index 0000000..7979a74 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/model/AlarmListModel.java @@ -0,0 +1,121 @@ +package com.casic.br.operationsite.model; + +import java.util.List; + +public class AlarmListModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsBean { + private String area; + private String createTime; + private String id; + private String location; + private String projectName; + private String type; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } + + public String getProjectName() { + return projectName; + } + + public void setProjectName(String projectName) { + this.projectName = projectName; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt index b7e8188..e034eba 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt @@ -12,4 +12,13 @@ @Query("offset") offset: Int, @Query("limit") limit: Int ): String + + /** + * 报警列表 + */ + @GET("/test/alarm/alarmList") + suspend fun obtainAlarmListByPage( + @Query("offset") offset: Int, + @Query("limit") limit: Int + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 63c4f5c..209bc31 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -19,4 +19,11 @@ suspend fun obtainWorkingListByPage(page: Int): String { return api.obtainWorkingListByPage(page, LocaleConstant.PAGE_LIMIT) } + + /** + * 报警列表 + */ + suspend fun obtainAlarmListByPage(page: Int): String { + return api.obtainAlarmListByPage(page, LocaleConstant.PAGE_LIMIT) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/utils/DialogHelper.kt b/app/src/main/java/com/casic/br/operationsite/utils/DialogHelper.kt new file mode 100644 index 0000000..751d8ce --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/utils/DialogHelper.kt @@ -0,0 +1,29 @@ +package com.casic.br.operationsite.utils; + +import android.app.Activity +import android.view.WindowManager +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + +object DialogHelper { + private lateinit var loadingDialog: QMUITipDialog + + fun showLoadingDialog(activity: Activity, message: String?) { + loadingDialog = QMUITipDialog.Builder(activity) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord(message) + .create() + if (!activity.isDestroyed) { + try { + loadingDialog.show() + } catch (e: WindowManager.BadTokenException) { + e.printStackTrace() + } + } + } + + fun dismissLoadingDialog() { + if (loadingDialog.isShowing) { + loadingDialog.dismiss() + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt new file mode 100644 index 0000000..d6594c7 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.operationsite.view + +import android.os.Handler +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.br.operationsite.R +import com.casic.br.operationsite.adapter.AlarmListAdapter +import com.casic.br.operationsite.extensions.showEmptyPage +import com.casic.br.operationsite.model.AlarmListModel +import com.casic.br.operationsite.utils.DialogHelper +import com.casic.br.operationsite.vm.AlarmViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_alarm_list.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class AlarmListActivity : KotlinBaseActivity() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var alarmListAdapter: AlarmListAdapter + private lateinit var alarmViewModel: AlarmViewModel + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initLayoutView(): Int = R.layout.activity_alarm_list + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) + + searchTextView.setOnClickListener { + if (searchInputView.text.isNullOrBlank()) { + "错误!请重新输入!".show(this) + } + } + } + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) + alarmViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + } + + override fun onResume() { + obtainAlarmListByPage() + super.onResume() + } + + override fun initEvent() { + alarmRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainAlarmListByPage() + } + alarmRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainAlarmListByPage() + } + + alarmViewModel.alarmModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + alarmRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows!!) + alarmRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022071201) + } + }) + + alarmViewModel.loadState.observe(this, { + if (!isLoadMore && !isRefresh) { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + } + }) + } + + private fun obtainAlarmListByPage() { + alarmViewModel.obtainAlarmListByPage(pageIndex) + } + + private val callback = Handler.Callback { + if (it.what == 2022071201) { + if (isRefresh || isLoadMore) { + alarmListAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage { + pageIndex = 1 + obtainAlarmListByPage() + } + } else { + emptyView!!.hide() + alarmListAdapter = AlarmListAdapter(this, dataBeans) + alarmRecyclerView!!.addItemDecoration( + DividerItemDecoration(this, DividerItemDecoration.VERTICAL) + ) + alarmRecyclerView!!.layoutManager = LinearLayoutManager(this) + alarmRecyclerView!!.adapter = alarmListAdapter + alarmListAdapter.setOnItemClickListener(object : + AlarmListAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + navigatePageTo(dataBeans[position].id) + } + }) + } + } + } + true + } + + /** + * xml申明式点击事件 + * @param view 事件持有者,不可删除 + * */ + fun finishActivity(view: View) { + finish() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt index bea8faa..1cf2a04 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt @@ -81,7 +81,7 @@ override fun initEvent() { alarmTextView.setOnClickListener { - navigatePageTo() + navigatePageTo() } fenceTextView.setOnClickListener { diff --git a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt new file mode 100644 index 0000000..f438b3b --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt @@ -0,0 +1,37 @@ +package com.casic.br.operationsite.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.br.operationsite.base.BaseApplication +import com.casic.br.operationsite.extensions.separateResponseCode +import com.casic.br.operationsite.extensions.toErrorMessage +import com.casic.br.operationsite.model.AlarmListModel +import com.casic.br.operationsite.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState + +class AlarmViewModel : BaseViewModel() { + + private val gson = Gson() + val alarmModel = MutableLiveData() + + fun obtainAlarmListByPage(page: Int) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainAlarmListByPage(page) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + alarmModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + loadState.value = LoadState.Success + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/WorkSiteViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/WorkSiteViewModel.kt index ab0d764..d5d8601 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/WorkSiteViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/WorkSiteViewModel.kt @@ -11,6 +11,7 @@ import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState /** * 现场作业ViewModel @@ -21,13 +22,16 @@ val workingModel = MutableLiveData() fun obtainWorkingListByPage(page: Int) = launch({ + loadState.value = LoadState.Loading val response = RetrofitServiceManager.obtainWorkingListByPage(page) val responseCode = response.separateResponseCode() if (responseCode == 200) { workingModel.value = gson.fromJson( response, object : TypeToken() {}.type ) + loadState.value = LoadState.Success } else { + loadState.value = LoadState.Fail response.toErrorMessage().show(BaseApplication.obtainInstance()) } }, { diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml new file mode 100644 index 0000000..fb34d0e --- /dev/null +++ b/app/src/main/res/drawable/button_main_selector.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1f8fe29..00b0e47 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -28,6 +28,7 @@ + +) : RecyclerView.Adapter() { + + private val layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_alarm_rv, parent, false) + ) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + + holder.groupNameView.text = rowsBean.projectName + holder.projectAreaView.text = rowsBean.area + holder.projectTypeView.text = rowsBean.type + holder.projectLocationView.text = rowsBean.location + + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var groupNameView: TextView = view.findViewById(R.id.groupNameView) + var projectAreaView: QMUIRoundButton = view.findViewById(R.id.projectAreaView) + var projectTypeView: QMUIRoundButton = view.findViewById(R.id.projectTypeView) + var projectLocationView: TextView = view.findViewById(R.id.projectLocationView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt index 7e1faf3..c053c9c 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt @@ -8,12 +8,14 @@ import com.casic.br.operationsite.adapter.WorkingListAdapter import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.WorkingListModel +import com.casic.br.operationsite.utils.DialogHelper import com.casic.br.operationsite.view.WorkSiteTabActivity import com.casic.br.operationsite.vm.WorkSiteViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState import kotlinx.android.synthetic.main.fragment_working.* import kotlinx.android.synthetic.main.include_empty_view.* @@ -81,6 +83,19 @@ weakReferenceHandler.sendEmptyMessage(2022071101) } }) + + workSiteViewModel.loadState.observe(this, { + if (!isLoadMore && !isRefresh) { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + } + }) } private fun obtainWorkingListByPage() { diff --git a/app/src/main/java/com/casic/br/operationsite/model/AlarmListModel.java b/app/src/main/java/com/casic/br/operationsite/model/AlarmListModel.java new file mode 100644 index 0000000..7979a74 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/model/AlarmListModel.java @@ -0,0 +1,121 @@ +package com.casic.br.operationsite.model; + +import java.util.List; + +public class AlarmListModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsBean { + private String area; + private String createTime; + private String id; + private String location; + private String projectName; + private String type; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } + + public String getProjectName() { + return projectName; + } + + public void setProjectName(String projectName) { + this.projectName = projectName; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt index b7e8188..e034eba 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt @@ -12,4 +12,13 @@ @Query("offset") offset: Int, @Query("limit") limit: Int ): String + + /** + * 报警列表 + */ + @GET("/test/alarm/alarmList") + suspend fun obtainAlarmListByPage( + @Query("offset") offset: Int, + @Query("limit") limit: Int + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 63c4f5c..209bc31 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -19,4 +19,11 @@ suspend fun obtainWorkingListByPage(page: Int): String { return api.obtainWorkingListByPage(page, LocaleConstant.PAGE_LIMIT) } + + /** + * 报警列表 + */ + suspend fun obtainAlarmListByPage(page: Int): String { + return api.obtainAlarmListByPage(page, LocaleConstant.PAGE_LIMIT) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/utils/DialogHelper.kt b/app/src/main/java/com/casic/br/operationsite/utils/DialogHelper.kt new file mode 100644 index 0000000..751d8ce --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/utils/DialogHelper.kt @@ -0,0 +1,29 @@ +package com.casic.br.operationsite.utils; + +import android.app.Activity +import android.view.WindowManager +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + +object DialogHelper { + private lateinit var loadingDialog: QMUITipDialog + + fun showLoadingDialog(activity: Activity, message: String?) { + loadingDialog = QMUITipDialog.Builder(activity) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord(message) + .create() + if (!activity.isDestroyed) { + try { + loadingDialog.show() + } catch (e: WindowManager.BadTokenException) { + e.printStackTrace() + } + } + } + + fun dismissLoadingDialog() { + if (loadingDialog.isShowing) { + loadingDialog.dismiss() + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt new file mode 100644 index 0000000..d6594c7 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.operationsite.view + +import android.os.Handler +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.br.operationsite.R +import com.casic.br.operationsite.adapter.AlarmListAdapter +import com.casic.br.operationsite.extensions.showEmptyPage +import com.casic.br.operationsite.model.AlarmListModel +import com.casic.br.operationsite.utils.DialogHelper +import com.casic.br.operationsite.vm.AlarmViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_alarm_list.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class AlarmListActivity : KotlinBaseActivity() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var alarmListAdapter: AlarmListAdapter + private lateinit var alarmViewModel: AlarmViewModel + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initLayoutView(): Int = R.layout.activity_alarm_list + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) + + searchTextView.setOnClickListener { + if (searchInputView.text.isNullOrBlank()) { + "错误!请重新输入!".show(this) + } + } + } + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) + alarmViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + } + + override fun onResume() { + obtainAlarmListByPage() + super.onResume() + } + + override fun initEvent() { + alarmRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainAlarmListByPage() + } + alarmRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainAlarmListByPage() + } + + alarmViewModel.alarmModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + alarmRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows!!) + alarmRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022071201) + } + }) + + alarmViewModel.loadState.observe(this, { + if (!isLoadMore && !isRefresh) { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + } + }) + } + + private fun obtainAlarmListByPage() { + alarmViewModel.obtainAlarmListByPage(pageIndex) + } + + private val callback = Handler.Callback { + if (it.what == 2022071201) { + if (isRefresh || isLoadMore) { + alarmListAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage { + pageIndex = 1 + obtainAlarmListByPage() + } + } else { + emptyView!!.hide() + alarmListAdapter = AlarmListAdapter(this, dataBeans) + alarmRecyclerView!!.addItemDecoration( + DividerItemDecoration(this, DividerItemDecoration.VERTICAL) + ) + alarmRecyclerView!!.layoutManager = LinearLayoutManager(this) + alarmRecyclerView!!.adapter = alarmListAdapter + alarmListAdapter.setOnItemClickListener(object : + AlarmListAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + navigatePageTo(dataBeans[position].id) + } + }) + } + } + } + true + } + + /** + * xml申明式点击事件 + * @param view 事件持有者,不可删除 + * */ + fun finishActivity(view: View) { + finish() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt index bea8faa..1cf2a04 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt @@ -81,7 +81,7 @@ override fun initEvent() { alarmTextView.setOnClickListener { - navigatePageTo() + navigatePageTo() } fenceTextView.setOnClickListener { diff --git a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt new file mode 100644 index 0000000..f438b3b --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt @@ -0,0 +1,37 @@ +package com.casic.br.operationsite.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.br.operationsite.base.BaseApplication +import com.casic.br.operationsite.extensions.separateResponseCode +import com.casic.br.operationsite.extensions.toErrorMessage +import com.casic.br.operationsite.model.AlarmListModel +import com.casic.br.operationsite.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState + +class AlarmViewModel : BaseViewModel() { + + private val gson = Gson() + val alarmModel = MutableLiveData() + + fun obtainAlarmListByPage(page: Int) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainAlarmListByPage(page) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + alarmModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + loadState.value = LoadState.Success + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/WorkSiteViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/WorkSiteViewModel.kt index ab0d764..d5d8601 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/WorkSiteViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/WorkSiteViewModel.kt @@ -11,6 +11,7 @@ import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState /** * 现场作业ViewModel @@ -21,13 +22,16 @@ val workingModel = MutableLiveData() fun obtainWorkingListByPage(page: Int) = launch({ + loadState.value = LoadState.Loading val response = RetrofitServiceManager.obtainWorkingListByPage(page) val responseCode = response.separateResponseCode() if (responseCode == 200) { workingModel.value = gson.fromJson( response, object : TypeToken() {}.type ) + loadState.value = LoadState.Success } else { + loadState.value = LoadState.Fail response.toErrorMessage().show(BaseApplication.obtainInstance()) } }, { diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml new file mode 100644 index 0000000..fb34d0e --- /dev/null +++ b/app/src/main/res/drawable/button_main_selector.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_alarm_location.xml b/app/src/main/res/drawable/ic_alarm_location.xml new file mode 100644 index 0000000..3b1513c --- /dev/null +++ b/app/src/main/res/drawable/ic_alarm_location.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1f8fe29..00b0e47 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -28,6 +28,7 @@ + +) : RecyclerView.Adapter() { + + private val layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { + return ItemViewHolder( + layoutInflater.inflate(R.layout.item_alarm_rv, parent, false) + ) + } + + override fun getItemCount(): Int = dataRows.size + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + + holder.groupNameView.text = rowsBean.projectName + holder.projectAreaView.text = rowsBean.area + holder.projectTypeView.text = rowsBean.type + holder.projectLocationView.text = rowsBean.location + + //绑定事件 + if (listener != null) { + holder.itemView.setOnClickListener { + listener!!.onClicked(position) + } + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var groupNameView: TextView = view.findViewById(R.id.groupNameView) + var projectAreaView: QMUIRoundButton = view.findViewById(R.id.projectAreaView) + var projectTypeView: QMUIRoundButton = view.findViewById(R.id.projectTypeView) + var projectLocationView: TextView = view.findViewById(R.id.projectLocationView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt index 7e1faf3..c053c9c 100644 --- a/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt +++ b/app/src/main/java/com/casic/br/operationsite/fragment/WorkingFragment.kt @@ -8,12 +8,14 @@ import com.casic.br.operationsite.adapter.WorkingListAdapter import com.casic.br.operationsite.extensions.showEmptyPage import com.casic.br.operationsite.model.WorkingListModel +import com.casic.br.operationsite.utils.DialogHelper import com.casic.br.operationsite.view.WorkSiteTabActivity import com.casic.br.operationsite.vm.WorkSiteViewModel import com.pengxh.kt.lite.base.KotlinBaseFragment import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState import kotlinx.android.synthetic.main.fragment_working.* import kotlinx.android.synthetic.main.include_empty_view.* @@ -81,6 +83,19 @@ weakReferenceHandler.sendEmptyMessage(2022071101) } }) + + workSiteViewModel.loadState.observe(this, { + if (!isLoadMore && !isRefresh) { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(requireActivity(), "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + } + }) } private fun obtainWorkingListByPage() { diff --git a/app/src/main/java/com/casic/br/operationsite/model/AlarmListModel.java b/app/src/main/java/com/casic/br/operationsite/model/AlarmListModel.java new file mode 100644 index 0000000..7979a74 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/model/AlarmListModel.java @@ -0,0 +1,121 @@ +package com.casic.br.operationsite.model; + +import java.util.List; + +public class AlarmListModel { + + private int code; + private DataBean data; + private String message; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataBean { + private List rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsBean { + private String area; + private String createTime; + private String id; + private String location; + private String projectName; + private String type; + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } + + public String getProjectName() { + return projectName; + } + + public void setProjectName(String projectName) { + this.projectName = projectName; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt index b7e8188..e034eba 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitService.kt @@ -12,4 +12,13 @@ @Query("offset") offset: Int, @Query("limit") limit: Int ): String + + /** + * 报警列表 + */ + @GET("/test/alarm/alarmList") + suspend fun obtainAlarmListByPage( + @Query("offset") offset: Int, + @Query("limit") limit: Int + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt index 63c4f5c..209bc31 100644 --- a/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/operationsite/retrofit/RetrofitServiceManager.kt @@ -19,4 +19,11 @@ suspend fun obtainWorkingListByPage(page: Int): String { return api.obtainWorkingListByPage(page, LocaleConstant.PAGE_LIMIT) } + + /** + * 报警列表 + */ + suspend fun obtainAlarmListByPage(page: Int): String { + return api.obtainAlarmListByPage(page, LocaleConstant.PAGE_LIMIT) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/utils/DialogHelper.kt b/app/src/main/java/com/casic/br/operationsite/utils/DialogHelper.kt new file mode 100644 index 0000000..751d8ce --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/utils/DialogHelper.kt @@ -0,0 +1,29 @@ +package com.casic.br.operationsite.utils; + +import android.app.Activity +import android.view.WindowManager +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog + +object DialogHelper { + private lateinit var loadingDialog: QMUITipDialog + + fun showLoadingDialog(activity: Activity, message: String?) { + loadingDialog = QMUITipDialog.Builder(activity) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord(message) + .create() + if (!activity.isDestroyed) { + try { + loadingDialog.show() + } catch (e: WindowManager.BadTokenException) { + e.printStackTrace() + } + } + } + + fun dismissLoadingDialog() { + if (loadingDialog.isShowing) { + loadingDialog.dismiss() + } + } +} diff --git a/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt new file mode 100644 index 0000000..d6594c7 --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/view/AlarmListActivity.kt @@ -0,0 +1,153 @@ +package com.casic.br.operationsite.view + +import android.os.Handler +import android.view.View +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration +import androidx.recyclerview.widget.LinearLayoutManager +import com.casic.br.operationsite.R +import com.casic.br.operationsite.adapter.AlarmListAdapter +import com.casic.br.operationsite.extensions.showEmptyPage +import com.casic.br.operationsite.model.AlarmListModel +import com.casic.br.operationsite.utils.DialogHelper +import com.casic.br.operationsite.vm.AlarmViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.convertColor +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.ImmerseStatusBarUtil +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_alarm_list.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class AlarmListActivity : KotlinBaseActivity() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var alarmListAdapter: AlarmListAdapter + private lateinit var alarmViewModel: AlarmViewModel + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initLayoutView(): Int = R.layout.activity_alarm_list + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(false).init() + ImmerseStatusBarUtil.setColor(this, R.color.mainThemeColor.convertColor(this)) + + searchTextView.setOnClickListener { + if (searchInputView.text.isNullOrBlank()) { + "错误!请重新输入!".show(this) + } + } + } + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) + alarmViewModel = ViewModelProvider(this).get(AlarmViewModel::class.java) + } + + override fun onResume() { + obtainAlarmListByPage() + super.onResume() + } + + override fun initEvent() { + alarmRefreshLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + obtainAlarmListByPage() + } + alarmRefreshLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + obtainAlarmListByPage() + } + + alarmViewModel.alarmModel.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.rows + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows!! + alarmRefreshLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows?.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows!!) + alarmRefreshLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows!! + } + } + weakReferenceHandler.sendEmptyMessage(2022071201) + } + }) + + alarmViewModel.loadState.observe(this, { + if (!isLoadMore && !isRefresh) { + when (it) { + is LoadState.Loading -> { + DialogHelper.showLoadingDialog(this, "数据加载中,请稍后") + } + else -> { + DialogHelper.dismissLoadingDialog() + } + } + } + }) + } + + private fun obtainAlarmListByPage() { + alarmViewModel.obtainAlarmListByPage(pageIndex) + } + + private val callback = Handler.Callback { + if (it.what == 2022071201) { + if (isRefresh || isLoadMore) { + alarmListAdapter.notifyDataSetChanged() + } else { //首次加载数据 + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage { + pageIndex = 1 + obtainAlarmListByPage() + } + } else { + emptyView!!.hide() + alarmListAdapter = AlarmListAdapter(this, dataBeans) + alarmRecyclerView!!.addItemDecoration( + DividerItemDecoration(this, DividerItemDecoration.VERTICAL) + ) + alarmRecyclerView!!.layoutManager = LinearLayoutManager(this) + alarmRecyclerView!!.adapter = alarmListAdapter + alarmListAdapter.setOnItemClickListener(object : + AlarmListAdapter.OnItemClickListener { + override fun onClicked(position: Int) { + navigatePageTo(dataBeans[position].id) + } + }) + } + } + } + true + } + + /** + * xml申明式点击事件 + * @param view 事件持有者,不可删除 + * */ + fun finishActivity(view: View) { + finish() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt index bea8faa..1cf2a04 100644 --- a/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt +++ b/app/src/main/java/com/casic/br/operationsite/view/WorkSiteTabActivity.kt @@ -81,7 +81,7 @@ override fun initEvent() { alarmTextView.setOnClickListener { - navigatePageTo() + navigatePageTo() } fenceTextView.setOnClickListener { diff --git a/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt new file mode 100644 index 0000000..f438b3b --- /dev/null +++ b/app/src/main/java/com/casic/br/operationsite/vm/AlarmViewModel.kt @@ -0,0 +1,37 @@ +package com.casic.br.operationsite.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.br.operationsite.base.BaseApplication +import com.casic.br.operationsite.extensions.separateResponseCode +import com.casic.br.operationsite.extensions.toErrorMessage +import com.casic.br.operationsite.model.AlarmListModel +import com.casic.br.operationsite.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState + +class AlarmViewModel : BaseViewModel() { + + private val gson = Gson() + val alarmModel = MutableLiveData() + + fun obtainAlarmListByPage(page: Int) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.obtainAlarmListByPage(page) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + alarmModel.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + loadState.value = LoadState.Success + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.obtainInstance()) + } + }, { + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/operationsite/vm/WorkSiteViewModel.kt b/app/src/main/java/com/casic/br/operationsite/vm/WorkSiteViewModel.kt index ab0d764..d5d8601 100644 --- a/app/src/main/java/com/casic/br/operationsite/vm/WorkSiteViewModel.kt +++ b/app/src/main/java/com/casic/br/operationsite/vm/WorkSiteViewModel.kt @@ -11,6 +11,7 @@ import com.pengxh.kt.lite.extensions.launch import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState /** * 现场作业ViewModel @@ -21,13 +22,16 @@ val workingModel = MutableLiveData() fun obtainWorkingListByPage(page: Int) = launch({ + loadState.value = LoadState.Loading val response = RetrofitServiceManager.obtainWorkingListByPage(page) val responseCode = response.separateResponseCode() if (responseCode == 200) { workingModel.value = gson.fromJson( response, object : TypeToken() {}.type ) + loadState.value = LoadState.Success } else { + loadState.value = LoadState.Fail response.toErrorMessage().show(BaseApplication.obtainInstance()) } }, { diff --git a/app/src/main/res/drawable/button_main_selector.xml b/app/src/main/res/drawable/button_main_selector.xml new file mode 100644 index 0000000..fb34d0e --- /dev/null +++ b/app/src/main/res/drawable/button_main_selector.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_alarm_location.xml b/app/src/main/res/drawable/ic_alarm_location.xml new file mode 100644 index 0000000..3b1513c --- /dev/null +++ b/app/src/main/res/drawable/ic_alarm_location.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/activity_alarm_list.xml b/app/src/main/res/layout/activity_alarm_list.xml new file mode 100644 index 0000000..e05ab3b --- /dev/null +++ b/app/src/main/res/layout/activity_alarm_list.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + +