diff --git a/.gitignore b/.gitignore index f0f71e2..ee6b213 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,12 @@ *.iml .gradle /local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml +/.idea .DS_Store /build /captures .externalNativeBuild .cxx .idea +*.apk +*.json diff --git a/.gitignore b/.gitignore index f0f71e2..ee6b213 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,12 @@ *.iml .gradle /local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml +/.idea .DS_Store /build /captures .externalNativeBuild .cxx .idea +*.apk +*.json diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fdb7255..6873489 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -109,7 +109,7 @@ - + diff --git a/.gitignore b/.gitignore index f0f71e2..ee6b213 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,12 @@ *.iml .gradle /local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml +/.idea .DS_Store /build /captures .externalNativeBuild .cxx .idea +*.apk +*.json diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fdb7255..6873489 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -109,7 +109,7 @@ - + diff --git a/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java b/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java index 2dcdc64..0364fc7 100644 --- a/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java +++ b/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java @@ -9,6 +9,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; @@ -25,7 +26,6 @@ private final Context context; private final List dataRows; private final LayoutInflater layoutInflater; - private PunishTypeAdapter adapter; public PackageCaseListAdapter(Context context, List dataRows) { this.context = context; @@ -36,7 +36,7 @@ @NonNull @Override public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new ItemViewHolder(layoutInflater.inflate(R.layout.item_package_rv, parent, false)); + return new ItemViewHolder(layoutInflater.inflate(R.layout.item_package_rv_l, parent, false)); } @Override @@ -57,16 +57,67 @@ return dataRows.size(); } - @SuppressLint("NotifyDataSetChanged") - public void refresh(List dataRows) { - this.dataRows.clear(); - this.dataRows.addAll(dataRows); - notifyDataSetChanged(); + public void refresh(List newRows) { + DiffUtil.Callback diffCallback = new DiffUtil.Callback() { + + @Override + public int getOldListSize() { + return dataRows.size(); + } + + @Override + public int getNewListSize() { + return newRows.size(); + } + + @Override + public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { + if (dataRows == null || newRows == null) { + return false; + } + + // 检查索引是否在有效范围内 + if (oldItemPosition < 0 || oldItemPosition >= dataRows.size() || + newItemPosition < 0 || newItemPosition >= newRows.size()) { + return false; + } + + // 获取元素并进行比较 + Object oldItem = dataRows.get(oldItemPosition); + Object newItem = newRows.get(newItemPosition); + + // 处理空指针情况 + if (oldItem == null && newItem == null) { + return true; + } + if (oldItem == null || newItem == null) { + return false; + } + + return oldItem.equals(newItem); + } + + @Override + public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { + return dataRows.get(oldItemPosition) == newRows.get(newItemPosition); + } + }; + + DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallback); + + dataRows.clear(); + dataRows.addAll(newRows); + + diffResult.dispatchUpdatesTo(this); } - public void loadMore(List dataRows) { - this.dataRows.addAll(dataRows); - notifyItemRangeInserted(this.dataRows.size(), dataRows.size()); + public void loadMore(List newRows) { + if (newRows.isEmpty()) { + return; + } + int startPosition = this.dataRows.size(); + this.dataRows.addAll(newRows); + notifyItemRangeInserted(startPosition, newRows.size()); } class ItemViewHolder extends RecyclerView.ViewHolder { @@ -84,7 +135,6 @@ casePunishView = itemView.findViewById(R.id.casePunishView); } - void bindView(PackageCaseBean.DataBean.RowsBean rowsBean) { //三包核实图片 String fileIdVerify = rowsBean.getFileIdVerify(); @@ -97,45 +147,6 @@ } caseTitleView.setText(rowsBean.getDescription()); caseDateView.setText("上报时间:" + rowsBean.getReportTime()); -// HttpRequestHelper.doRequest(LocaleConstant.SHOP_PUNISH_LIST, rowsBean.getShopId(), new IHttpRequestListener() { -// @Override -// public void onSuccess(ResponseBody resultBean) { -// try { -// PunishTypeBean punishTypeBean = gson.fromJson(resultBean.string(), PunishTypeBean.class); -// if (punishTypeBean.getData().size() != 0) { -// //获取商铺处罚次数 -// HttpRequestHelper.doRequest(LocaleConstant.SHOP_PUNISH_TYPE, rowsBean.getShopId(), new IHttpRequestListener() { -// @Override -// public void onSuccess(ResponseBody resultBean) { -// try { -// PunishTimesBean punishTimesBean = gson.fromJson(resultBean.string(), PunishTimesBean.class); -// -// adapter = new PunishTypeAdapter(context, punishTypeBean.getData(), punishTimesBean.getData()); -// LinearLayoutManager layoutManager = new LinearLayoutManager(context); -// layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); -// punishRecyclerView.setLayoutManager(layoutManager); -// punishRecyclerView.setAdapter(adapter); -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } -// -// @Override -// public void onFailure(Throwable throwable) { -// -// } -// }); -// } -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } -// -// @Override -// public void onFailure(Throwable throwable) { -// -// } -// }); } } diff --git a/.gitignore b/.gitignore index f0f71e2..ee6b213 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,12 @@ *.iml .gradle /local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml +/.idea .DS_Store /build /captures .externalNativeBuild .cxx .idea +*.apk +*.json diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fdb7255..6873489 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -109,7 +109,7 @@ - + diff --git a/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java b/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java index 2dcdc64..0364fc7 100644 --- a/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java +++ b/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java @@ -9,6 +9,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; @@ -25,7 +26,6 @@ private final Context context; private final List dataRows; private final LayoutInflater layoutInflater; - private PunishTypeAdapter adapter; public PackageCaseListAdapter(Context context, List dataRows) { this.context = context; @@ -36,7 +36,7 @@ @NonNull @Override public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new ItemViewHolder(layoutInflater.inflate(R.layout.item_package_rv, parent, false)); + return new ItemViewHolder(layoutInflater.inflate(R.layout.item_package_rv_l, parent, false)); } @Override @@ -57,16 +57,67 @@ return dataRows.size(); } - @SuppressLint("NotifyDataSetChanged") - public void refresh(List dataRows) { - this.dataRows.clear(); - this.dataRows.addAll(dataRows); - notifyDataSetChanged(); + public void refresh(List newRows) { + DiffUtil.Callback diffCallback = new DiffUtil.Callback() { + + @Override + public int getOldListSize() { + return dataRows.size(); + } + + @Override + public int getNewListSize() { + return newRows.size(); + } + + @Override + public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { + if (dataRows == null || newRows == null) { + return false; + } + + // 检查索引是否在有效范围内 + if (oldItemPosition < 0 || oldItemPosition >= dataRows.size() || + newItemPosition < 0 || newItemPosition >= newRows.size()) { + return false; + } + + // 获取元素并进行比较 + Object oldItem = dataRows.get(oldItemPosition); + Object newItem = newRows.get(newItemPosition); + + // 处理空指针情况 + if (oldItem == null && newItem == null) { + return true; + } + if (oldItem == null || newItem == null) { + return false; + } + + return oldItem.equals(newItem); + } + + @Override + public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { + return dataRows.get(oldItemPosition) == newRows.get(newItemPosition); + } + }; + + DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallback); + + dataRows.clear(); + dataRows.addAll(newRows); + + diffResult.dispatchUpdatesTo(this); } - public void loadMore(List dataRows) { - this.dataRows.addAll(dataRows); - notifyItemRangeInserted(this.dataRows.size(), dataRows.size()); + public void loadMore(List newRows) { + if (newRows.isEmpty()) { + return; + } + int startPosition = this.dataRows.size(); + this.dataRows.addAll(newRows); + notifyItemRangeInserted(startPosition, newRows.size()); } class ItemViewHolder extends RecyclerView.ViewHolder { @@ -84,7 +135,6 @@ casePunishView = itemView.findViewById(R.id.casePunishView); } - void bindView(PackageCaseBean.DataBean.RowsBean rowsBean) { //三包核实图片 String fileIdVerify = rowsBean.getFileIdVerify(); @@ -97,45 +147,6 @@ } caseTitleView.setText(rowsBean.getDescription()); caseDateView.setText("上报时间:" + rowsBean.getReportTime()); -// HttpRequestHelper.doRequest(LocaleConstant.SHOP_PUNISH_LIST, rowsBean.getShopId(), new IHttpRequestListener() { -// @Override -// public void onSuccess(ResponseBody resultBean) { -// try { -// PunishTypeBean punishTypeBean = gson.fromJson(resultBean.string(), PunishTypeBean.class); -// if (punishTypeBean.getData().size() != 0) { -// //获取商铺处罚次数 -// HttpRequestHelper.doRequest(LocaleConstant.SHOP_PUNISH_TYPE, rowsBean.getShopId(), new IHttpRequestListener() { -// @Override -// public void onSuccess(ResponseBody resultBean) { -// try { -// PunishTimesBean punishTimesBean = gson.fromJson(resultBean.string(), PunishTimesBean.class); -// -// adapter = new PunishTypeAdapter(context, punishTypeBean.getData(), punishTimesBean.getData()); -// LinearLayoutManager layoutManager = new LinearLayoutManager(context); -// layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); -// punishRecyclerView.setLayoutManager(layoutManager); -// punishRecyclerView.setAdapter(adapter); -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } -// -// @Override -// public void onFailure(Throwable throwable) { -// -// } -// }); -// } -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } -// -// @Override -// public void onFailure(Throwable throwable) { -// -// } -// }); } } diff --git a/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java b/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java deleted file mode 100644 index 2e178e5..0000000 --- a/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.casic.dcms.adapter; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.core.content.ContextCompat; -import androidx.recyclerview.widget.RecyclerView; - -import com.casic.dcms.R; -import com.casic.dcms.model.PunishTimesBean; -import com.casic.dcms.model.PunishTypeBean; - -import java.util.List; - -@SuppressLint("SetTextI18n") -public class PunishTypeAdapter extends RecyclerView.Adapter { - - private final Context context; - private final List dataRows; - private final PunishTimesBean.DataBean dataBean; - private final LayoutInflater layoutInflater; - - PunishTypeAdapter(Context context, List dataRows, PunishTimesBean.DataBean dataBean) { - this.context = context; - this.dataRows = dataRows; - this.dataBean = dataBean; - this.layoutInflater = LayoutInflater.from(context); - } - - @NonNull - @Override - public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new ItemViewHolder(layoutInflater.inflate(R.layout.item_punish_recycleview, parent, false)); - } - - @Override - public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { - String typeName = dataRows.get(position).getPunishTypeName(); - int color, times; - switch (typeName) { - case "劝导": - times = dataBean.getPersuade(); - color = ContextCompat.getColor(context, R.color.persuadeColor); - break; - case "警告": - times = dataBean.getWarn(); - color = ContextCompat.getColor(context, R.color.warnColor); - break; - case "处罚": - times = dataBean.getPunish(); - color = ContextCompat.getColor(context, R.color.punishColor); - break; - default: - times = 0; - color = ContextCompat.getColor(context, R.color.mainThemeColor); - break; - } - if (times == 0) { - holder.punishTypeView.setVisibility(View.GONE); - } else { - holder.punishTypeView.setText(typeName + " x " + times); - holder.punishTypeView.setBackgroundColor(color); - } - } - - @Override - public int getItemCount() { - return dataRows.size(); - } - - static class ItemViewHolder extends RecyclerView.ViewHolder { - - private final TextView punishTypeView; - - ItemViewHolder(@NonNull View itemView) { - super(itemView); - punishTypeView = itemView.findViewById(R.id.punishTypeView); - } - } -} diff --git a/.gitignore b/.gitignore index f0f71e2..ee6b213 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,12 @@ *.iml .gradle /local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml +/.idea .DS_Store /build /captures .externalNativeBuild .cxx .idea +*.apk +*.json diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fdb7255..6873489 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -109,7 +109,7 @@ - + diff --git a/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java b/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java index 2dcdc64..0364fc7 100644 --- a/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java +++ b/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java @@ -9,6 +9,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; @@ -25,7 +26,6 @@ private final Context context; private final List dataRows; private final LayoutInflater layoutInflater; - private PunishTypeAdapter adapter; public PackageCaseListAdapter(Context context, List dataRows) { this.context = context; @@ -36,7 +36,7 @@ @NonNull @Override public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new ItemViewHolder(layoutInflater.inflate(R.layout.item_package_rv, parent, false)); + return new ItemViewHolder(layoutInflater.inflate(R.layout.item_package_rv_l, parent, false)); } @Override @@ -57,16 +57,67 @@ return dataRows.size(); } - @SuppressLint("NotifyDataSetChanged") - public void refresh(List dataRows) { - this.dataRows.clear(); - this.dataRows.addAll(dataRows); - notifyDataSetChanged(); + public void refresh(List newRows) { + DiffUtil.Callback diffCallback = new DiffUtil.Callback() { + + @Override + public int getOldListSize() { + return dataRows.size(); + } + + @Override + public int getNewListSize() { + return newRows.size(); + } + + @Override + public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { + if (dataRows == null || newRows == null) { + return false; + } + + // 检查索引是否在有效范围内 + if (oldItemPosition < 0 || oldItemPosition >= dataRows.size() || + newItemPosition < 0 || newItemPosition >= newRows.size()) { + return false; + } + + // 获取元素并进行比较 + Object oldItem = dataRows.get(oldItemPosition); + Object newItem = newRows.get(newItemPosition); + + // 处理空指针情况 + if (oldItem == null && newItem == null) { + return true; + } + if (oldItem == null || newItem == null) { + return false; + } + + return oldItem.equals(newItem); + } + + @Override + public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { + return dataRows.get(oldItemPosition) == newRows.get(newItemPosition); + } + }; + + DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallback); + + dataRows.clear(); + dataRows.addAll(newRows); + + diffResult.dispatchUpdatesTo(this); } - public void loadMore(List dataRows) { - this.dataRows.addAll(dataRows); - notifyItemRangeInserted(this.dataRows.size(), dataRows.size()); + public void loadMore(List newRows) { + if (newRows.isEmpty()) { + return; + } + int startPosition = this.dataRows.size(); + this.dataRows.addAll(newRows); + notifyItemRangeInserted(startPosition, newRows.size()); } class ItemViewHolder extends RecyclerView.ViewHolder { @@ -84,7 +135,6 @@ casePunishView = itemView.findViewById(R.id.casePunishView); } - void bindView(PackageCaseBean.DataBean.RowsBean rowsBean) { //三包核实图片 String fileIdVerify = rowsBean.getFileIdVerify(); @@ -97,45 +147,6 @@ } caseTitleView.setText(rowsBean.getDescription()); caseDateView.setText("上报时间:" + rowsBean.getReportTime()); -// HttpRequestHelper.doRequest(LocaleConstant.SHOP_PUNISH_LIST, rowsBean.getShopId(), new IHttpRequestListener() { -// @Override -// public void onSuccess(ResponseBody resultBean) { -// try { -// PunishTypeBean punishTypeBean = gson.fromJson(resultBean.string(), PunishTypeBean.class); -// if (punishTypeBean.getData().size() != 0) { -// //获取商铺处罚次数 -// HttpRequestHelper.doRequest(LocaleConstant.SHOP_PUNISH_TYPE, rowsBean.getShopId(), new IHttpRequestListener() { -// @Override -// public void onSuccess(ResponseBody resultBean) { -// try { -// PunishTimesBean punishTimesBean = gson.fromJson(resultBean.string(), PunishTimesBean.class); -// -// adapter = new PunishTypeAdapter(context, punishTypeBean.getData(), punishTimesBean.getData()); -// LinearLayoutManager layoutManager = new LinearLayoutManager(context); -// layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); -// punishRecyclerView.setLayoutManager(layoutManager); -// punishRecyclerView.setAdapter(adapter); -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } -// -// @Override -// public void onFailure(Throwable throwable) { -// -// } -// }); -// } -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } -// -// @Override -// public void onFailure(Throwable throwable) { -// -// } -// }); } } diff --git a/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java b/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java deleted file mode 100644 index 2e178e5..0000000 --- a/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.casic.dcms.adapter; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.core.content.ContextCompat; -import androidx.recyclerview.widget.RecyclerView; - -import com.casic.dcms.R; -import com.casic.dcms.model.PunishTimesBean; -import com.casic.dcms.model.PunishTypeBean; - -import java.util.List; - -@SuppressLint("SetTextI18n") -public class PunishTypeAdapter extends RecyclerView.Adapter { - - private final Context context; - private final List dataRows; - private final PunishTimesBean.DataBean dataBean; - private final LayoutInflater layoutInflater; - - PunishTypeAdapter(Context context, List dataRows, PunishTimesBean.DataBean dataBean) { - this.context = context; - this.dataRows = dataRows; - this.dataBean = dataBean; - this.layoutInflater = LayoutInflater.from(context); - } - - @NonNull - @Override - public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new ItemViewHolder(layoutInflater.inflate(R.layout.item_punish_recycleview, parent, false)); - } - - @Override - public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { - String typeName = dataRows.get(position).getPunishTypeName(); - int color, times; - switch (typeName) { - case "劝导": - times = dataBean.getPersuade(); - color = ContextCompat.getColor(context, R.color.persuadeColor); - break; - case "警告": - times = dataBean.getWarn(); - color = ContextCompat.getColor(context, R.color.warnColor); - break; - case "处罚": - times = dataBean.getPunish(); - color = ContextCompat.getColor(context, R.color.punishColor); - break; - default: - times = 0; - color = ContextCompat.getColor(context, R.color.mainThemeColor); - break; - } - if (times == 0) { - holder.punishTypeView.setVisibility(View.GONE); - } else { - holder.punishTypeView.setText(typeName + " x " + times); - holder.punishTypeView.setBackgroundColor(color); - } - } - - @Override - public int getItemCount() { - return dataRows.size(); - } - - static class ItemViewHolder extends RecyclerView.ViewHolder { - - private final TextView punishTypeView; - - ItemViewHolder(@NonNull View itemView) { - super(itemView); - punishTypeView = itemView.findViewById(R.id.punishTypeView); - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java b/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java deleted file mode 100644 index dc57ca3..0000000 --- a/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.dcms.model; - -public class PunishTimesBean { - 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 { - /** - * warn : 0 - * punish : 0 - * persuade : 0 - */ - - private int warn; - private int punish; - private int persuade; - - public int getWarn() { - return warn; - } - - public void setWarn(int warn) { - this.warn = warn; - } - - public int getPunish() { - return punish; - } - - public void setPunish(int punish) { - this.punish = punish; - } - - public int getPersuade() { - return persuade; - } - - public void setPersuade(int persuade) { - this.persuade = persuade; - } - } -} diff --git a/.gitignore b/.gitignore index f0f71e2..ee6b213 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,12 @@ *.iml .gradle /local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml +/.idea .DS_Store /build /captures .externalNativeBuild .cxx .idea +*.apk +*.json diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fdb7255..6873489 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -109,7 +109,7 @@ - + diff --git a/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java b/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java index 2dcdc64..0364fc7 100644 --- a/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java +++ b/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java @@ -9,6 +9,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; @@ -25,7 +26,6 @@ private final Context context; private final List dataRows; private final LayoutInflater layoutInflater; - private PunishTypeAdapter adapter; public PackageCaseListAdapter(Context context, List dataRows) { this.context = context; @@ -36,7 +36,7 @@ @NonNull @Override public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new ItemViewHolder(layoutInflater.inflate(R.layout.item_package_rv, parent, false)); + return new ItemViewHolder(layoutInflater.inflate(R.layout.item_package_rv_l, parent, false)); } @Override @@ -57,16 +57,67 @@ return dataRows.size(); } - @SuppressLint("NotifyDataSetChanged") - public void refresh(List dataRows) { - this.dataRows.clear(); - this.dataRows.addAll(dataRows); - notifyDataSetChanged(); + public void refresh(List newRows) { + DiffUtil.Callback diffCallback = new DiffUtil.Callback() { + + @Override + public int getOldListSize() { + return dataRows.size(); + } + + @Override + public int getNewListSize() { + return newRows.size(); + } + + @Override + public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { + if (dataRows == null || newRows == null) { + return false; + } + + // 检查索引是否在有效范围内 + if (oldItemPosition < 0 || oldItemPosition >= dataRows.size() || + newItemPosition < 0 || newItemPosition >= newRows.size()) { + return false; + } + + // 获取元素并进行比较 + Object oldItem = dataRows.get(oldItemPosition); + Object newItem = newRows.get(newItemPosition); + + // 处理空指针情况 + if (oldItem == null && newItem == null) { + return true; + } + if (oldItem == null || newItem == null) { + return false; + } + + return oldItem.equals(newItem); + } + + @Override + public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { + return dataRows.get(oldItemPosition) == newRows.get(newItemPosition); + } + }; + + DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallback); + + dataRows.clear(); + dataRows.addAll(newRows); + + diffResult.dispatchUpdatesTo(this); } - public void loadMore(List dataRows) { - this.dataRows.addAll(dataRows); - notifyItemRangeInserted(this.dataRows.size(), dataRows.size()); + public void loadMore(List newRows) { + if (newRows.isEmpty()) { + return; + } + int startPosition = this.dataRows.size(); + this.dataRows.addAll(newRows); + notifyItemRangeInserted(startPosition, newRows.size()); } class ItemViewHolder extends RecyclerView.ViewHolder { @@ -84,7 +135,6 @@ casePunishView = itemView.findViewById(R.id.casePunishView); } - void bindView(PackageCaseBean.DataBean.RowsBean rowsBean) { //三包核实图片 String fileIdVerify = rowsBean.getFileIdVerify(); @@ -97,45 +147,6 @@ } caseTitleView.setText(rowsBean.getDescription()); caseDateView.setText("上报时间:" + rowsBean.getReportTime()); -// HttpRequestHelper.doRequest(LocaleConstant.SHOP_PUNISH_LIST, rowsBean.getShopId(), new IHttpRequestListener() { -// @Override -// public void onSuccess(ResponseBody resultBean) { -// try { -// PunishTypeBean punishTypeBean = gson.fromJson(resultBean.string(), PunishTypeBean.class); -// if (punishTypeBean.getData().size() != 0) { -// //获取商铺处罚次数 -// HttpRequestHelper.doRequest(LocaleConstant.SHOP_PUNISH_TYPE, rowsBean.getShopId(), new IHttpRequestListener() { -// @Override -// public void onSuccess(ResponseBody resultBean) { -// try { -// PunishTimesBean punishTimesBean = gson.fromJson(resultBean.string(), PunishTimesBean.class); -// -// adapter = new PunishTypeAdapter(context, punishTypeBean.getData(), punishTimesBean.getData()); -// LinearLayoutManager layoutManager = new LinearLayoutManager(context); -// layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); -// punishRecyclerView.setLayoutManager(layoutManager); -// punishRecyclerView.setAdapter(adapter); -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } -// -// @Override -// public void onFailure(Throwable throwable) { -// -// } -// }); -// } -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } -// -// @Override -// public void onFailure(Throwable throwable) { -// -// } -// }); } } diff --git a/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java b/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java deleted file mode 100644 index 2e178e5..0000000 --- a/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.casic.dcms.adapter; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.core.content.ContextCompat; -import androidx.recyclerview.widget.RecyclerView; - -import com.casic.dcms.R; -import com.casic.dcms.model.PunishTimesBean; -import com.casic.dcms.model.PunishTypeBean; - -import java.util.List; - -@SuppressLint("SetTextI18n") -public class PunishTypeAdapter extends RecyclerView.Adapter { - - private final Context context; - private final List dataRows; - private final PunishTimesBean.DataBean dataBean; - private final LayoutInflater layoutInflater; - - PunishTypeAdapter(Context context, List dataRows, PunishTimesBean.DataBean dataBean) { - this.context = context; - this.dataRows = dataRows; - this.dataBean = dataBean; - this.layoutInflater = LayoutInflater.from(context); - } - - @NonNull - @Override - public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new ItemViewHolder(layoutInflater.inflate(R.layout.item_punish_recycleview, parent, false)); - } - - @Override - public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { - String typeName = dataRows.get(position).getPunishTypeName(); - int color, times; - switch (typeName) { - case "劝导": - times = dataBean.getPersuade(); - color = ContextCompat.getColor(context, R.color.persuadeColor); - break; - case "警告": - times = dataBean.getWarn(); - color = ContextCompat.getColor(context, R.color.warnColor); - break; - case "处罚": - times = dataBean.getPunish(); - color = ContextCompat.getColor(context, R.color.punishColor); - break; - default: - times = 0; - color = ContextCompat.getColor(context, R.color.mainThemeColor); - break; - } - if (times == 0) { - holder.punishTypeView.setVisibility(View.GONE); - } else { - holder.punishTypeView.setText(typeName + " x " + times); - holder.punishTypeView.setBackgroundColor(color); - } - } - - @Override - public int getItemCount() { - return dataRows.size(); - } - - static class ItemViewHolder extends RecyclerView.ViewHolder { - - private final TextView punishTypeView; - - ItemViewHolder(@NonNull View itemView) { - super(itemView); - punishTypeView = itemView.findViewById(R.id.punishTypeView); - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java b/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java deleted file mode 100644 index dc57ca3..0000000 --- a/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.dcms.model; - -public class PunishTimesBean { - 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 { - /** - * warn : 0 - * punish : 0 - * persuade : 0 - */ - - private int warn; - private int punish; - private int persuade; - - public int getWarn() { - return warn; - } - - public void setWarn(int warn) { - this.warn = warn; - } - - public int getPunish() { - return punish; - } - - public void setPunish(int punish) { - this.punish = punish; - } - - public int getPersuade() { - return persuade; - } - - public void setPersuade(int persuade) { - this.persuade = persuade; - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java b/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java deleted file mode 100644 index 00b6a98..0000000 --- a/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.casic.dcms.model; - -import java.util.List; - -public class PunishTypeBean { - private int code; - private String message; - private boolean success; - private List data; - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - 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 List getData() { - return data; - } - - public void setData(List data) { - this.data = data; - } - - public static class DataBean { - /** - * punishTime : 2021-01-12 09:08:59 - * punishTypeName : 处罚 - * punishImage : images - * punishType : 1 - * punishRemarks : 处罚 - */ - - private String punishTime; - private String punishTypeName; - private String punishImage; - private String punishType; - private String punishRemarks; - - public String getPunishTime() { - return punishTime; - } - - public void setPunishTime(String punishTime) { - this.punishTime = punishTime; - } - - public String getPunishTypeName() { - return punishTypeName; - } - - public void setPunishTypeName(String punishTypeName) { - this.punishTypeName = punishTypeName; - } - - public String getPunishImage() { - return punishImage; - } - - public void setPunishImage(String punishImage) { - this.punishImage = punishImage; - } - - public String getPunishType() { - return punishType; - } - - public void setPunishType(String punishType) { - this.punishType = punishType; - } - - public String getPunishRemarks() { - return punishRemarks; - } - - public void setPunishRemarks(String punishRemarks) { - this.punishRemarks = punishRemarks; - } - } -} diff --git a/.gitignore b/.gitignore index f0f71e2..ee6b213 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,12 @@ *.iml .gradle /local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml +/.idea .DS_Store /build /captures .externalNativeBuild .cxx .idea +*.apk +*.json diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fdb7255..6873489 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -109,7 +109,7 @@ - + diff --git a/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java b/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java index 2dcdc64..0364fc7 100644 --- a/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java +++ b/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java @@ -9,6 +9,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; @@ -25,7 +26,6 @@ private final Context context; private final List dataRows; private final LayoutInflater layoutInflater; - private PunishTypeAdapter adapter; public PackageCaseListAdapter(Context context, List dataRows) { this.context = context; @@ -36,7 +36,7 @@ @NonNull @Override public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new ItemViewHolder(layoutInflater.inflate(R.layout.item_package_rv, parent, false)); + return new ItemViewHolder(layoutInflater.inflate(R.layout.item_package_rv_l, parent, false)); } @Override @@ -57,16 +57,67 @@ return dataRows.size(); } - @SuppressLint("NotifyDataSetChanged") - public void refresh(List dataRows) { - this.dataRows.clear(); - this.dataRows.addAll(dataRows); - notifyDataSetChanged(); + public void refresh(List newRows) { + DiffUtil.Callback diffCallback = new DiffUtil.Callback() { + + @Override + public int getOldListSize() { + return dataRows.size(); + } + + @Override + public int getNewListSize() { + return newRows.size(); + } + + @Override + public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { + if (dataRows == null || newRows == null) { + return false; + } + + // 检查索引是否在有效范围内 + if (oldItemPosition < 0 || oldItemPosition >= dataRows.size() || + newItemPosition < 0 || newItemPosition >= newRows.size()) { + return false; + } + + // 获取元素并进行比较 + Object oldItem = dataRows.get(oldItemPosition); + Object newItem = newRows.get(newItemPosition); + + // 处理空指针情况 + if (oldItem == null && newItem == null) { + return true; + } + if (oldItem == null || newItem == null) { + return false; + } + + return oldItem.equals(newItem); + } + + @Override + public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { + return dataRows.get(oldItemPosition) == newRows.get(newItemPosition); + } + }; + + DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallback); + + dataRows.clear(); + dataRows.addAll(newRows); + + diffResult.dispatchUpdatesTo(this); } - public void loadMore(List dataRows) { - this.dataRows.addAll(dataRows); - notifyItemRangeInserted(this.dataRows.size(), dataRows.size()); + public void loadMore(List newRows) { + if (newRows.isEmpty()) { + return; + } + int startPosition = this.dataRows.size(); + this.dataRows.addAll(newRows); + notifyItemRangeInserted(startPosition, newRows.size()); } class ItemViewHolder extends RecyclerView.ViewHolder { @@ -84,7 +135,6 @@ casePunishView = itemView.findViewById(R.id.casePunishView); } - void bindView(PackageCaseBean.DataBean.RowsBean rowsBean) { //三包核实图片 String fileIdVerify = rowsBean.getFileIdVerify(); @@ -97,45 +147,6 @@ } caseTitleView.setText(rowsBean.getDescription()); caseDateView.setText("上报时间:" + rowsBean.getReportTime()); -// HttpRequestHelper.doRequest(LocaleConstant.SHOP_PUNISH_LIST, rowsBean.getShopId(), new IHttpRequestListener() { -// @Override -// public void onSuccess(ResponseBody resultBean) { -// try { -// PunishTypeBean punishTypeBean = gson.fromJson(resultBean.string(), PunishTypeBean.class); -// if (punishTypeBean.getData().size() != 0) { -// //获取商铺处罚次数 -// HttpRequestHelper.doRequest(LocaleConstant.SHOP_PUNISH_TYPE, rowsBean.getShopId(), new IHttpRequestListener() { -// @Override -// public void onSuccess(ResponseBody resultBean) { -// try { -// PunishTimesBean punishTimesBean = gson.fromJson(resultBean.string(), PunishTimesBean.class); -// -// adapter = new PunishTypeAdapter(context, punishTypeBean.getData(), punishTimesBean.getData()); -// LinearLayoutManager layoutManager = new LinearLayoutManager(context); -// layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); -// punishRecyclerView.setLayoutManager(layoutManager); -// punishRecyclerView.setAdapter(adapter); -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } -// -// @Override -// public void onFailure(Throwable throwable) { -// -// } -// }); -// } -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } -// -// @Override -// public void onFailure(Throwable throwable) { -// -// } -// }); } } diff --git a/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java b/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java deleted file mode 100644 index 2e178e5..0000000 --- a/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.casic.dcms.adapter; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.core.content.ContextCompat; -import androidx.recyclerview.widget.RecyclerView; - -import com.casic.dcms.R; -import com.casic.dcms.model.PunishTimesBean; -import com.casic.dcms.model.PunishTypeBean; - -import java.util.List; - -@SuppressLint("SetTextI18n") -public class PunishTypeAdapter extends RecyclerView.Adapter { - - private final Context context; - private final List dataRows; - private final PunishTimesBean.DataBean dataBean; - private final LayoutInflater layoutInflater; - - PunishTypeAdapter(Context context, List dataRows, PunishTimesBean.DataBean dataBean) { - this.context = context; - this.dataRows = dataRows; - this.dataBean = dataBean; - this.layoutInflater = LayoutInflater.from(context); - } - - @NonNull - @Override - public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new ItemViewHolder(layoutInflater.inflate(R.layout.item_punish_recycleview, parent, false)); - } - - @Override - public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { - String typeName = dataRows.get(position).getPunishTypeName(); - int color, times; - switch (typeName) { - case "劝导": - times = dataBean.getPersuade(); - color = ContextCompat.getColor(context, R.color.persuadeColor); - break; - case "警告": - times = dataBean.getWarn(); - color = ContextCompat.getColor(context, R.color.warnColor); - break; - case "处罚": - times = dataBean.getPunish(); - color = ContextCompat.getColor(context, R.color.punishColor); - break; - default: - times = 0; - color = ContextCompat.getColor(context, R.color.mainThemeColor); - break; - } - if (times == 0) { - holder.punishTypeView.setVisibility(View.GONE); - } else { - holder.punishTypeView.setText(typeName + " x " + times); - holder.punishTypeView.setBackgroundColor(color); - } - } - - @Override - public int getItemCount() { - return dataRows.size(); - } - - static class ItemViewHolder extends RecyclerView.ViewHolder { - - private final TextView punishTypeView; - - ItemViewHolder(@NonNull View itemView) { - super(itemView); - punishTypeView = itemView.findViewById(R.id.punishTypeView); - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java b/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java deleted file mode 100644 index dc57ca3..0000000 --- a/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.dcms.model; - -public class PunishTimesBean { - 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 { - /** - * warn : 0 - * punish : 0 - * persuade : 0 - */ - - private int warn; - private int punish; - private int persuade; - - public int getWarn() { - return warn; - } - - public void setWarn(int warn) { - this.warn = warn; - } - - public int getPunish() { - return punish; - } - - public void setPunish(int punish) { - this.punish = punish; - } - - public int getPersuade() { - return persuade; - } - - public void setPersuade(int persuade) { - this.persuade = persuade; - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java b/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java deleted file mode 100644 index 00b6a98..0000000 --- a/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.casic.dcms.model; - -import java.util.List; - -public class PunishTypeBean { - private int code; - private String message; - private boolean success; - private List data; - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - 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 List getData() { - return data; - } - - public void setData(List data) { - this.data = data; - } - - public static class DataBean { - /** - * punishTime : 2021-01-12 09:08:59 - * punishTypeName : 处罚 - * punishImage : images - * punishType : 1 - * punishRemarks : 处罚 - */ - - private String punishTime; - private String punishTypeName; - private String punishImage; - private String punishType; - private String punishRemarks; - - public String getPunishTime() { - return punishTime; - } - - public void setPunishTime(String punishTime) { - this.punishTime = punishTime; - } - - public String getPunishTypeName() { - return punishTypeName; - } - - public void setPunishTypeName(String punishTypeName) { - this.punishTypeName = punishTypeName; - } - - public String getPunishImage() { - return punishImage; - } - - public void setPunishImage(String punishImage) { - this.punishImage = punishImage; - } - - public String getPunishType() { - return punishType; - } - - public void setPunishType(String punishType) { - this.punishType = punishType; - } - - public String getPunishRemarks() { - return punishRemarks; - } - - public void setPunishRemarks(String punishRemarks) { - this.punishRemarks = punishRemarks; - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/UnitFeatureBean.java b/app/src/main/java/com/casic/dcms/model/UnitFeatureBean.java deleted file mode 100644 index a4d8337..0000000 --- a/app/src/main/java/com/casic/dcms/model/UnitFeatureBean.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.casic.dcms.model; - -public class UnitFeatureBean { - - private String BGID; - private String BGNAME; - private int OBJECTID; - - public String getBGID() { - return BGID; - } - - public void setBGID(String BGID) { - this.BGID = BGID; - } - - public String getBGNAME() { - return BGNAME; - } - - public void setBGNAME(String BGNAME) { - this.BGNAME = BGNAME; - } - - public int getOBJECTID() { - return OBJECTID; - } - - public void setOBJECTID(int OBJECTID) { - this.OBJECTID = OBJECTID; - } -} diff --git a/.gitignore b/.gitignore index f0f71e2..ee6b213 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,12 @@ *.iml .gradle /local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml +/.idea .DS_Store /build /captures .externalNativeBuild .cxx .idea +*.apk +*.json diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fdb7255..6873489 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -109,7 +109,7 @@ - + diff --git a/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java b/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java index 2dcdc64..0364fc7 100644 --- a/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java +++ b/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java @@ -9,6 +9,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; @@ -25,7 +26,6 @@ private final Context context; private final List dataRows; private final LayoutInflater layoutInflater; - private PunishTypeAdapter adapter; public PackageCaseListAdapter(Context context, List dataRows) { this.context = context; @@ -36,7 +36,7 @@ @NonNull @Override public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new ItemViewHolder(layoutInflater.inflate(R.layout.item_package_rv, parent, false)); + return new ItemViewHolder(layoutInflater.inflate(R.layout.item_package_rv_l, parent, false)); } @Override @@ -57,16 +57,67 @@ return dataRows.size(); } - @SuppressLint("NotifyDataSetChanged") - public void refresh(List dataRows) { - this.dataRows.clear(); - this.dataRows.addAll(dataRows); - notifyDataSetChanged(); + public void refresh(List newRows) { + DiffUtil.Callback diffCallback = new DiffUtil.Callback() { + + @Override + public int getOldListSize() { + return dataRows.size(); + } + + @Override + public int getNewListSize() { + return newRows.size(); + } + + @Override + public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { + if (dataRows == null || newRows == null) { + return false; + } + + // 检查索引是否在有效范围内 + if (oldItemPosition < 0 || oldItemPosition >= dataRows.size() || + newItemPosition < 0 || newItemPosition >= newRows.size()) { + return false; + } + + // 获取元素并进行比较 + Object oldItem = dataRows.get(oldItemPosition); + Object newItem = newRows.get(newItemPosition); + + // 处理空指针情况 + if (oldItem == null && newItem == null) { + return true; + } + if (oldItem == null || newItem == null) { + return false; + } + + return oldItem.equals(newItem); + } + + @Override + public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { + return dataRows.get(oldItemPosition) == newRows.get(newItemPosition); + } + }; + + DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallback); + + dataRows.clear(); + dataRows.addAll(newRows); + + diffResult.dispatchUpdatesTo(this); } - public void loadMore(List dataRows) { - this.dataRows.addAll(dataRows); - notifyItemRangeInserted(this.dataRows.size(), dataRows.size()); + public void loadMore(List newRows) { + if (newRows.isEmpty()) { + return; + } + int startPosition = this.dataRows.size(); + this.dataRows.addAll(newRows); + notifyItemRangeInserted(startPosition, newRows.size()); } class ItemViewHolder extends RecyclerView.ViewHolder { @@ -84,7 +135,6 @@ casePunishView = itemView.findViewById(R.id.casePunishView); } - void bindView(PackageCaseBean.DataBean.RowsBean rowsBean) { //三包核实图片 String fileIdVerify = rowsBean.getFileIdVerify(); @@ -97,45 +147,6 @@ } caseTitleView.setText(rowsBean.getDescription()); caseDateView.setText("上报时间:" + rowsBean.getReportTime()); -// HttpRequestHelper.doRequest(LocaleConstant.SHOP_PUNISH_LIST, rowsBean.getShopId(), new IHttpRequestListener() { -// @Override -// public void onSuccess(ResponseBody resultBean) { -// try { -// PunishTypeBean punishTypeBean = gson.fromJson(resultBean.string(), PunishTypeBean.class); -// if (punishTypeBean.getData().size() != 0) { -// //获取商铺处罚次数 -// HttpRequestHelper.doRequest(LocaleConstant.SHOP_PUNISH_TYPE, rowsBean.getShopId(), new IHttpRequestListener() { -// @Override -// public void onSuccess(ResponseBody resultBean) { -// try { -// PunishTimesBean punishTimesBean = gson.fromJson(resultBean.string(), PunishTimesBean.class); -// -// adapter = new PunishTypeAdapter(context, punishTypeBean.getData(), punishTimesBean.getData()); -// LinearLayoutManager layoutManager = new LinearLayoutManager(context); -// layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); -// punishRecyclerView.setLayoutManager(layoutManager); -// punishRecyclerView.setAdapter(adapter); -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } -// -// @Override -// public void onFailure(Throwable throwable) { -// -// } -// }); -// } -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } -// -// @Override -// public void onFailure(Throwable throwable) { -// -// } -// }); } } diff --git a/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java b/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java deleted file mode 100644 index 2e178e5..0000000 --- a/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.casic.dcms.adapter; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.core.content.ContextCompat; -import androidx.recyclerview.widget.RecyclerView; - -import com.casic.dcms.R; -import com.casic.dcms.model.PunishTimesBean; -import com.casic.dcms.model.PunishTypeBean; - -import java.util.List; - -@SuppressLint("SetTextI18n") -public class PunishTypeAdapter extends RecyclerView.Adapter { - - private final Context context; - private final List dataRows; - private final PunishTimesBean.DataBean dataBean; - private final LayoutInflater layoutInflater; - - PunishTypeAdapter(Context context, List dataRows, PunishTimesBean.DataBean dataBean) { - this.context = context; - this.dataRows = dataRows; - this.dataBean = dataBean; - this.layoutInflater = LayoutInflater.from(context); - } - - @NonNull - @Override - public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new ItemViewHolder(layoutInflater.inflate(R.layout.item_punish_recycleview, parent, false)); - } - - @Override - public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { - String typeName = dataRows.get(position).getPunishTypeName(); - int color, times; - switch (typeName) { - case "劝导": - times = dataBean.getPersuade(); - color = ContextCompat.getColor(context, R.color.persuadeColor); - break; - case "警告": - times = dataBean.getWarn(); - color = ContextCompat.getColor(context, R.color.warnColor); - break; - case "处罚": - times = dataBean.getPunish(); - color = ContextCompat.getColor(context, R.color.punishColor); - break; - default: - times = 0; - color = ContextCompat.getColor(context, R.color.mainThemeColor); - break; - } - if (times == 0) { - holder.punishTypeView.setVisibility(View.GONE); - } else { - holder.punishTypeView.setText(typeName + " x " + times); - holder.punishTypeView.setBackgroundColor(color); - } - } - - @Override - public int getItemCount() { - return dataRows.size(); - } - - static class ItemViewHolder extends RecyclerView.ViewHolder { - - private final TextView punishTypeView; - - ItemViewHolder(@NonNull View itemView) { - super(itemView); - punishTypeView = itemView.findViewById(R.id.punishTypeView); - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java b/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java deleted file mode 100644 index dc57ca3..0000000 --- a/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.dcms.model; - -public class PunishTimesBean { - 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 { - /** - * warn : 0 - * punish : 0 - * persuade : 0 - */ - - private int warn; - private int punish; - private int persuade; - - public int getWarn() { - return warn; - } - - public void setWarn(int warn) { - this.warn = warn; - } - - public int getPunish() { - return punish; - } - - public void setPunish(int punish) { - this.punish = punish; - } - - public int getPersuade() { - return persuade; - } - - public void setPersuade(int persuade) { - this.persuade = persuade; - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java b/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java deleted file mode 100644 index 00b6a98..0000000 --- a/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.casic.dcms.model; - -import java.util.List; - -public class PunishTypeBean { - private int code; - private String message; - private boolean success; - private List data; - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - 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 List getData() { - return data; - } - - public void setData(List data) { - this.data = data; - } - - public static class DataBean { - /** - * punishTime : 2021-01-12 09:08:59 - * punishTypeName : 处罚 - * punishImage : images - * punishType : 1 - * punishRemarks : 处罚 - */ - - private String punishTime; - private String punishTypeName; - private String punishImage; - private String punishType; - private String punishRemarks; - - public String getPunishTime() { - return punishTime; - } - - public void setPunishTime(String punishTime) { - this.punishTime = punishTime; - } - - public String getPunishTypeName() { - return punishTypeName; - } - - public void setPunishTypeName(String punishTypeName) { - this.punishTypeName = punishTypeName; - } - - public String getPunishImage() { - return punishImage; - } - - public void setPunishImage(String punishImage) { - this.punishImage = punishImage; - } - - public String getPunishType() { - return punishType; - } - - public void setPunishType(String punishType) { - this.punishType = punishType; - } - - public String getPunishRemarks() { - return punishRemarks; - } - - public void setPunishRemarks(String punishRemarks) { - this.punishRemarks = punishRemarks; - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/UnitFeatureBean.java b/app/src/main/java/com/casic/dcms/model/UnitFeatureBean.java deleted file mode 100644 index a4d8337..0000000 --- a/app/src/main/java/com/casic/dcms/model/UnitFeatureBean.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.casic.dcms.model; - -public class UnitFeatureBean { - - private String BGID; - private String BGNAME; - private int OBJECTID; - - public String getBGID() { - return BGID; - } - - public void setBGID(String BGID) { - this.BGID = BGID; - } - - public String getBGNAME() { - return BGNAME; - } - - public void setBGNAME(String BGNAME) { - this.BGNAME = BGNAME; - } - - public int getOBJECTID() { - return OBJECTID; - } - - public void setOBJECTID(int OBJECTID) { - this.OBJECTID = OBJECTID; - } -} diff --git a/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java b/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java index 0578f7b..b0c24d5 100644 --- a/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java +++ b/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java @@ -1,9 +1,16 @@ package com.casic.dcms.model; +import android.os.Parcel; +import android.os.Parcelable; + +import androidx.annotation.NonNull; + import java.util.List; -public class WellAlarmListBean { - +/** + * Parcelable 是 Android 平台专门为性能优化而设计的序列化机制,通常比 Serializable 快 10 倍左右 + */ +public class WellAlarmListBean implements Parcelable { private int code; private DataBean data; private String message; @@ -41,7 +48,43 @@ this.success = success; } - public static class DataBean { + public WellAlarmListBean() { + + } + + protected WellAlarmListBean(Parcel in) { + code = in.readInt(); + data = in.readParcelable(DataBean.class.getClassLoader()); + message = in.readString(); + success = in.readByte() != 0; + } + + public static final Creator CREATOR = new Creator() { + @Override + public WellAlarmListBean createFromParcel(Parcel in) { + return new WellAlarmListBean(in); + } + + @Override + public WellAlarmListBean[] newArray(int size) { + return new WellAlarmListBean[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + dest.writeInt(code); + dest.writeParcelable(data, flags); + dest.writeString(message); + dest.writeByte((byte) (success ? 1 : 0)); + } + + public static class DataBean implements Parcelable { private int total; private List rows; @@ -62,7 +105,38 @@ this.rows = rows; } - public static class RowsBean { + public DataBean() { + } + + protected DataBean(Parcel in) { + total = in.readInt(); + rows = in.createTypedArrayList(RowsBean.CREATOR); + } + + public static final Creator CREATOR = new Creator() { + @Override + public DataBean createFromParcel(Parcel in) { + return new DataBean(in); + } + + @Override + public DataBean[] newArray(int size) { + return new DataBean[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(total); + dest.writeTypedList(rows); + } + + public static class RowsBean implements Parcelable { /** * alarmContent : 1 * deptName : 崇仁县城管局 @@ -296,6 +370,79 @@ public void setStatus(String status) { this.status = status; } + + public RowsBean() { + } + + protected RowsBean(Parcel in) { + alarmContent = in.readInt(); + deptName = in.readString(); + jobStatus = in.readString(); + alarmContentName = in.readString(); + wellCode = in.readString(); + alarmTime = in.readString(); + deptid = in.readString(); + alarmTypeName = in.readString(); + alarmMessage = in.readString(); + staff = in.readString(); + deviceId = in.readString(); + jobId = in.readString(); + jobStatusName = in.readString(); + alarmType = in.readString(); + alarmValue = in.readString(); + devcode = in.readString(); + statusName = in.readString(); + alarmLevel = in.readString(); + tel = in.readString(); + id = in.readString(); + wellId = in.readString(); + position = in.readString(); + status = in.readString(); + } + + public static final Creator CREATOR = new Creator() { + @Override + public RowsBean createFromParcel(Parcel in) { + return new RowsBean(in); + } + + @Override + public RowsBean[] newArray(int size) { + return new RowsBean[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(alarmContent); + dest.writeString(deptName); + dest.writeString(jobStatus); + dest.writeString(alarmContentName); + dest.writeString(wellCode); + dest.writeString(alarmTime); + dest.writeString(deptid); + dest.writeString(alarmTypeName); + dest.writeString(alarmMessage); + dest.writeString(staff); + dest.writeString(deviceId); + dest.writeString(jobId); + dest.writeString(jobStatusName); + dest.writeString(alarmType); + dest.writeString(alarmValue); + dest.writeString(devcode); + dest.writeString(statusName); + dest.writeString(alarmLevel); + dest.writeString(tel); + dest.writeString(id); + dest.writeString(wellId); + dest.writeString(position); + dest.writeString(status); + } } } } diff --git a/.gitignore b/.gitignore index f0f71e2..ee6b213 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,12 @@ *.iml .gradle /local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml +/.idea .DS_Store /build /captures .externalNativeBuild .cxx .idea +*.apk +*.json diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fdb7255..6873489 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -109,7 +109,7 @@ - + diff --git a/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java b/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java index 2dcdc64..0364fc7 100644 --- a/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java +++ b/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java @@ -9,6 +9,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; @@ -25,7 +26,6 @@ private final Context context; private final List dataRows; private final LayoutInflater layoutInflater; - private PunishTypeAdapter adapter; public PackageCaseListAdapter(Context context, List dataRows) { this.context = context; @@ -36,7 +36,7 @@ @NonNull @Override public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new ItemViewHolder(layoutInflater.inflate(R.layout.item_package_rv, parent, false)); + return new ItemViewHolder(layoutInflater.inflate(R.layout.item_package_rv_l, parent, false)); } @Override @@ -57,16 +57,67 @@ return dataRows.size(); } - @SuppressLint("NotifyDataSetChanged") - public void refresh(List dataRows) { - this.dataRows.clear(); - this.dataRows.addAll(dataRows); - notifyDataSetChanged(); + public void refresh(List newRows) { + DiffUtil.Callback diffCallback = new DiffUtil.Callback() { + + @Override + public int getOldListSize() { + return dataRows.size(); + } + + @Override + public int getNewListSize() { + return newRows.size(); + } + + @Override + public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { + if (dataRows == null || newRows == null) { + return false; + } + + // 检查索引是否在有效范围内 + if (oldItemPosition < 0 || oldItemPosition >= dataRows.size() || + newItemPosition < 0 || newItemPosition >= newRows.size()) { + return false; + } + + // 获取元素并进行比较 + Object oldItem = dataRows.get(oldItemPosition); + Object newItem = newRows.get(newItemPosition); + + // 处理空指针情况 + if (oldItem == null && newItem == null) { + return true; + } + if (oldItem == null || newItem == null) { + return false; + } + + return oldItem.equals(newItem); + } + + @Override + public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { + return dataRows.get(oldItemPosition) == newRows.get(newItemPosition); + } + }; + + DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallback); + + dataRows.clear(); + dataRows.addAll(newRows); + + diffResult.dispatchUpdatesTo(this); } - public void loadMore(List dataRows) { - this.dataRows.addAll(dataRows); - notifyItemRangeInserted(this.dataRows.size(), dataRows.size()); + public void loadMore(List newRows) { + if (newRows.isEmpty()) { + return; + } + int startPosition = this.dataRows.size(); + this.dataRows.addAll(newRows); + notifyItemRangeInserted(startPosition, newRows.size()); } class ItemViewHolder extends RecyclerView.ViewHolder { @@ -84,7 +135,6 @@ casePunishView = itemView.findViewById(R.id.casePunishView); } - void bindView(PackageCaseBean.DataBean.RowsBean rowsBean) { //三包核实图片 String fileIdVerify = rowsBean.getFileIdVerify(); @@ -97,45 +147,6 @@ } caseTitleView.setText(rowsBean.getDescription()); caseDateView.setText("上报时间:" + rowsBean.getReportTime()); -// HttpRequestHelper.doRequest(LocaleConstant.SHOP_PUNISH_LIST, rowsBean.getShopId(), new IHttpRequestListener() { -// @Override -// public void onSuccess(ResponseBody resultBean) { -// try { -// PunishTypeBean punishTypeBean = gson.fromJson(resultBean.string(), PunishTypeBean.class); -// if (punishTypeBean.getData().size() != 0) { -// //获取商铺处罚次数 -// HttpRequestHelper.doRequest(LocaleConstant.SHOP_PUNISH_TYPE, rowsBean.getShopId(), new IHttpRequestListener() { -// @Override -// public void onSuccess(ResponseBody resultBean) { -// try { -// PunishTimesBean punishTimesBean = gson.fromJson(resultBean.string(), PunishTimesBean.class); -// -// adapter = new PunishTypeAdapter(context, punishTypeBean.getData(), punishTimesBean.getData()); -// LinearLayoutManager layoutManager = new LinearLayoutManager(context); -// layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); -// punishRecyclerView.setLayoutManager(layoutManager); -// punishRecyclerView.setAdapter(adapter); -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } -// -// @Override -// public void onFailure(Throwable throwable) { -// -// } -// }); -// } -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } -// -// @Override -// public void onFailure(Throwable throwable) { -// -// } -// }); } } diff --git a/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java b/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java deleted file mode 100644 index 2e178e5..0000000 --- a/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.casic.dcms.adapter; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.core.content.ContextCompat; -import androidx.recyclerview.widget.RecyclerView; - -import com.casic.dcms.R; -import com.casic.dcms.model.PunishTimesBean; -import com.casic.dcms.model.PunishTypeBean; - -import java.util.List; - -@SuppressLint("SetTextI18n") -public class PunishTypeAdapter extends RecyclerView.Adapter { - - private final Context context; - private final List dataRows; - private final PunishTimesBean.DataBean dataBean; - private final LayoutInflater layoutInflater; - - PunishTypeAdapter(Context context, List dataRows, PunishTimesBean.DataBean dataBean) { - this.context = context; - this.dataRows = dataRows; - this.dataBean = dataBean; - this.layoutInflater = LayoutInflater.from(context); - } - - @NonNull - @Override - public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new ItemViewHolder(layoutInflater.inflate(R.layout.item_punish_recycleview, parent, false)); - } - - @Override - public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { - String typeName = dataRows.get(position).getPunishTypeName(); - int color, times; - switch (typeName) { - case "劝导": - times = dataBean.getPersuade(); - color = ContextCompat.getColor(context, R.color.persuadeColor); - break; - case "警告": - times = dataBean.getWarn(); - color = ContextCompat.getColor(context, R.color.warnColor); - break; - case "处罚": - times = dataBean.getPunish(); - color = ContextCompat.getColor(context, R.color.punishColor); - break; - default: - times = 0; - color = ContextCompat.getColor(context, R.color.mainThemeColor); - break; - } - if (times == 0) { - holder.punishTypeView.setVisibility(View.GONE); - } else { - holder.punishTypeView.setText(typeName + " x " + times); - holder.punishTypeView.setBackgroundColor(color); - } - } - - @Override - public int getItemCount() { - return dataRows.size(); - } - - static class ItemViewHolder extends RecyclerView.ViewHolder { - - private final TextView punishTypeView; - - ItemViewHolder(@NonNull View itemView) { - super(itemView); - punishTypeView = itemView.findViewById(R.id.punishTypeView); - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java b/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java deleted file mode 100644 index dc57ca3..0000000 --- a/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.dcms.model; - -public class PunishTimesBean { - 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 { - /** - * warn : 0 - * punish : 0 - * persuade : 0 - */ - - private int warn; - private int punish; - private int persuade; - - public int getWarn() { - return warn; - } - - public void setWarn(int warn) { - this.warn = warn; - } - - public int getPunish() { - return punish; - } - - public void setPunish(int punish) { - this.punish = punish; - } - - public int getPersuade() { - return persuade; - } - - public void setPersuade(int persuade) { - this.persuade = persuade; - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java b/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java deleted file mode 100644 index 00b6a98..0000000 --- a/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.casic.dcms.model; - -import java.util.List; - -public class PunishTypeBean { - private int code; - private String message; - private boolean success; - private List data; - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - 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 List getData() { - return data; - } - - public void setData(List data) { - this.data = data; - } - - public static class DataBean { - /** - * punishTime : 2021-01-12 09:08:59 - * punishTypeName : 处罚 - * punishImage : images - * punishType : 1 - * punishRemarks : 处罚 - */ - - private String punishTime; - private String punishTypeName; - private String punishImage; - private String punishType; - private String punishRemarks; - - public String getPunishTime() { - return punishTime; - } - - public void setPunishTime(String punishTime) { - this.punishTime = punishTime; - } - - public String getPunishTypeName() { - return punishTypeName; - } - - public void setPunishTypeName(String punishTypeName) { - this.punishTypeName = punishTypeName; - } - - public String getPunishImage() { - return punishImage; - } - - public void setPunishImage(String punishImage) { - this.punishImage = punishImage; - } - - public String getPunishType() { - return punishType; - } - - public void setPunishType(String punishType) { - this.punishType = punishType; - } - - public String getPunishRemarks() { - return punishRemarks; - } - - public void setPunishRemarks(String punishRemarks) { - this.punishRemarks = punishRemarks; - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/UnitFeatureBean.java b/app/src/main/java/com/casic/dcms/model/UnitFeatureBean.java deleted file mode 100644 index a4d8337..0000000 --- a/app/src/main/java/com/casic/dcms/model/UnitFeatureBean.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.casic.dcms.model; - -public class UnitFeatureBean { - - private String BGID; - private String BGNAME; - private int OBJECTID; - - public String getBGID() { - return BGID; - } - - public void setBGID(String BGID) { - this.BGID = BGID; - } - - public String getBGNAME() { - return BGNAME; - } - - public void setBGNAME(String BGNAME) { - this.BGNAME = BGNAME; - } - - public int getOBJECTID() { - return OBJECTID; - } - - public void setOBJECTID(int OBJECTID) { - this.OBJECTID = OBJECTID; - } -} diff --git a/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java b/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java index 0578f7b..b0c24d5 100644 --- a/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java +++ b/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java @@ -1,9 +1,16 @@ package com.casic.dcms.model; +import android.os.Parcel; +import android.os.Parcelable; + +import androidx.annotation.NonNull; + import java.util.List; -public class WellAlarmListBean { - +/** + * Parcelable 是 Android 平台专门为性能优化而设计的序列化机制,通常比 Serializable 快 10 倍左右 + */ +public class WellAlarmListBean implements Parcelable { private int code; private DataBean data; private String message; @@ -41,7 +48,43 @@ this.success = success; } - public static class DataBean { + public WellAlarmListBean() { + + } + + protected WellAlarmListBean(Parcel in) { + code = in.readInt(); + data = in.readParcelable(DataBean.class.getClassLoader()); + message = in.readString(); + success = in.readByte() != 0; + } + + public static final Creator CREATOR = new Creator() { + @Override + public WellAlarmListBean createFromParcel(Parcel in) { + return new WellAlarmListBean(in); + } + + @Override + public WellAlarmListBean[] newArray(int size) { + return new WellAlarmListBean[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + dest.writeInt(code); + dest.writeParcelable(data, flags); + dest.writeString(message); + dest.writeByte((byte) (success ? 1 : 0)); + } + + public static class DataBean implements Parcelable { private int total; private List rows; @@ -62,7 +105,38 @@ this.rows = rows; } - public static class RowsBean { + public DataBean() { + } + + protected DataBean(Parcel in) { + total = in.readInt(); + rows = in.createTypedArrayList(RowsBean.CREATOR); + } + + public static final Creator CREATOR = new Creator() { + @Override + public DataBean createFromParcel(Parcel in) { + return new DataBean(in); + } + + @Override + public DataBean[] newArray(int size) { + return new DataBean[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(total); + dest.writeTypedList(rows); + } + + public static class RowsBean implements Parcelable { /** * alarmContent : 1 * deptName : 崇仁县城管局 @@ -296,6 +370,79 @@ public void setStatus(String status) { this.status = status; } + + public RowsBean() { + } + + protected RowsBean(Parcel in) { + alarmContent = in.readInt(); + deptName = in.readString(); + jobStatus = in.readString(); + alarmContentName = in.readString(); + wellCode = in.readString(); + alarmTime = in.readString(); + deptid = in.readString(); + alarmTypeName = in.readString(); + alarmMessage = in.readString(); + staff = in.readString(); + deviceId = in.readString(); + jobId = in.readString(); + jobStatusName = in.readString(); + alarmType = in.readString(); + alarmValue = in.readString(); + devcode = in.readString(); + statusName = in.readString(); + alarmLevel = in.readString(); + tel = in.readString(); + id = in.readString(); + wellId = in.readString(); + position = in.readString(); + status = in.readString(); + } + + public static final Creator CREATOR = new Creator() { + @Override + public RowsBean createFromParcel(Parcel in) { + return new RowsBean(in); + } + + @Override + public RowsBean[] newArray(int size) { + return new RowsBean[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(alarmContent); + dest.writeString(deptName); + dest.writeString(jobStatus); + dest.writeString(alarmContentName); + dest.writeString(wellCode); + dest.writeString(alarmTime); + dest.writeString(deptid); + dest.writeString(alarmTypeName); + dest.writeString(alarmMessage); + dest.writeString(staff); + dest.writeString(deviceId); + dest.writeString(jobId); + dest.writeString(jobStatusName); + dest.writeString(alarmType); + dest.writeString(alarmValue); + dest.writeString(devcode); + dest.writeString(statusName); + dest.writeString(alarmLevel); + dest.writeString(tel); + dest.writeString(id); + dest.writeString(wellId); + dest.writeString(position); + dest.writeString(status); + } } } } diff --git a/app/src/main/java/com/casic/dcms/model/WellDetailBean.java b/app/src/main/java/com/casic/dcms/model/WellDetailBean.java index cea8774..4e6c8fd 100644 --- a/app/src/main/java/com/casic/dcms/model/WellDetailBean.java +++ b/app/src/main/java/com/casic/dcms/model/WellDetailBean.java @@ -60,7 +60,6 @@ } public static class FieldAliasesBean { - private String objectid; private String 编号; private String 附属物编码; @@ -190,7 +189,6 @@ } public static class SpatialReferenceBean { - private int wkid; private int latestWkid; @@ -212,7 +210,6 @@ } public static class FieldsBean { - private String name; private String type; private String alias; @@ -252,7 +249,6 @@ } public static class FeaturesBean { - private AttributesBean attributes; private GeometryBean geometry; diff --git a/.gitignore b/.gitignore index f0f71e2..ee6b213 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,12 @@ *.iml .gradle /local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml +/.idea .DS_Store /build /captures .externalNativeBuild .cxx .idea +*.apk +*.json diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fdb7255..6873489 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -109,7 +109,7 @@ - + diff --git a/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java b/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java index 2dcdc64..0364fc7 100644 --- a/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java +++ b/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java @@ -9,6 +9,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; @@ -25,7 +26,6 @@ private final Context context; private final List dataRows; private final LayoutInflater layoutInflater; - private PunishTypeAdapter adapter; public PackageCaseListAdapter(Context context, List dataRows) { this.context = context; @@ -36,7 +36,7 @@ @NonNull @Override public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new ItemViewHolder(layoutInflater.inflate(R.layout.item_package_rv, parent, false)); + return new ItemViewHolder(layoutInflater.inflate(R.layout.item_package_rv_l, parent, false)); } @Override @@ -57,16 +57,67 @@ return dataRows.size(); } - @SuppressLint("NotifyDataSetChanged") - public void refresh(List dataRows) { - this.dataRows.clear(); - this.dataRows.addAll(dataRows); - notifyDataSetChanged(); + public void refresh(List newRows) { + DiffUtil.Callback diffCallback = new DiffUtil.Callback() { + + @Override + public int getOldListSize() { + return dataRows.size(); + } + + @Override + public int getNewListSize() { + return newRows.size(); + } + + @Override + public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { + if (dataRows == null || newRows == null) { + return false; + } + + // 检查索引是否在有效范围内 + if (oldItemPosition < 0 || oldItemPosition >= dataRows.size() || + newItemPosition < 0 || newItemPosition >= newRows.size()) { + return false; + } + + // 获取元素并进行比较 + Object oldItem = dataRows.get(oldItemPosition); + Object newItem = newRows.get(newItemPosition); + + // 处理空指针情况 + if (oldItem == null && newItem == null) { + return true; + } + if (oldItem == null || newItem == null) { + return false; + } + + return oldItem.equals(newItem); + } + + @Override + public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { + return dataRows.get(oldItemPosition) == newRows.get(newItemPosition); + } + }; + + DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallback); + + dataRows.clear(); + dataRows.addAll(newRows); + + diffResult.dispatchUpdatesTo(this); } - public void loadMore(List dataRows) { - this.dataRows.addAll(dataRows); - notifyItemRangeInserted(this.dataRows.size(), dataRows.size()); + public void loadMore(List newRows) { + if (newRows.isEmpty()) { + return; + } + int startPosition = this.dataRows.size(); + this.dataRows.addAll(newRows); + notifyItemRangeInserted(startPosition, newRows.size()); } class ItemViewHolder extends RecyclerView.ViewHolder { @@ -84,7 +135,6 @@ casePunishView = itemView.findViewById(R.id.casePunishView); } - void bindView(PackageCaseBean.DataBean.RowsBean rowsBean) { //三包核实图片 String fileIdVerify = rowsBean.getFileIdVerify(); @@ -97,45 +147,6 @@ } caseTitleView.setText(rowsBean.getDescription()); caseDateView.setText("上报时间:" + rowsBean.getReportTime()); -// HttpRequestHelper.doRequest(LocaleConstant.SHOP_PUNISH_LIST, rowsBean.getShopId(), new IHttpRequestListener() { -// @Override -// public void onSuccess(ResponseBody resultBean) { -// try { -// PunishTypeBean punishTypeBean = gson.fromJson(resultBean.string(), PunishTypeBean.class); -// if (punishTypeBean.getData().size() != 0) { -// //获取商铺处罚次数 -// HttpRequestHelper.doRequest(LocaleConstant.SHOP_PUNISH_TYPE, rowsBean.getShopId(), new IHttpRequestListener() { -// @Override -// public void onSuccess(ResponseBody resultBean) { -// try { -// PunishTimesBean punishTimesBean = gson.fromJson(resultBean.string(), PunishTimesBean.class); -// -// adapter = new PunishTypeAdapter(context, punishTypeBean.getData(), punishTimesBean.getData()); -// LinearLayoutManager layoutManager = new LinearLayoutManager(context); -// layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); -// punishRecyclerView.setLayoutManager(layoutManager); -// punishRecyclerView.setAdapter(adapter); -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } -// -// @Override -// public void onFailure(Throwable throwable) { -// -// } -// }); -// } -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } -// -// @Override -// public void onFailure(Throwable throwable) { -// -// } -// }); } } diff --git a/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java b/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java deleted file mode 100644 index 2e178e5..0000000 --- a/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.casic.dcms.adapter; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.core.content.ContextCompat; -import androidx.recyclerview.widget.RecyclerView; - -import com.casic.dcms.R; -import com.casic.dcms.model.PunishTimesBean; -import com.casic.dcms.model.PunishTypeBean; - -import java.util.List; - -@SuppressLint("SetTextI18n") -public class PunishTypeAdapter extends RecyclerView.Adapter { - - private final Context context; - private final List dataRows; - private final PunishTimesBean.DataBean dataBean; - private final LayoutInflater layoutInflater; - - PunishTypeAdapter(Context context, List dataRows, PunishTimesBean.DataBean dataBean) { - this.context = context; - this.dataRows = dataRows; - this.dataBean = dataBean; - this.layoutInflater = LayoutInflater.from(context); - } - - @NonNull - @Override - public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new ItemViewHolder(layoutInflater.inflate(R.layout.item_punish_recycleview, parent, false)); - } - - @Override - public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { - String typeName = dataRows.get(position).getPunishTypeName(); - int color, times; - switch (typeName) { - case "劝导": - times = dataBean.getPersuade(); - color = ContextCompat.getColor(context, R.color.persuadeColor); - break; - case "警告": - times = dataBean.getWarn(); - color = ContextCompat.getColor(context, R.color.warnColor); - break; - case "处罚": - times = dataBean.getPunish(); - color = ContextCompat.getColor(context, R.color.punishColor); - break; - default: - times = 0; - color = ContextCompat.getColor(context, R.color.mainThemeColor); - break; - } - if (times == 0) { - holder.punishTypeView.setVisibility(View.GONE); - } else { - holder.punishTypeView.setText(typeName + " x " + times); - holder.punishTypeView.setBackgroundColor(color); - } - } - - @Override - public int getItemCount() { - return dataRows.size(); - } - - static class ItemViewHolder extends RecyclerView.ViewHolder { - - private final TextView punishTypeView; - - ItemViewHolder(@NonNull View itemView) { - super(itemView); - punishTypeView = itemView.findViewById(R.id.punishTypeView); - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java b/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java deleted file mode 100644 index dc57ca3..0000000 --- a/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.dcms.model; - -public class PunishTimesBean { - 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 { - /** - * warn : 0 - * punish : 0 - * persuade : 0 - */ - - private int warn; - private int punish; - private int persuade; - - public int getWarn() { - return warn; - } - - public void setWarn(int warn) { - this.warn = warn; - } - - public int getPunish() { - return punish; - } - - public void setPunish(int punish) { - this.punish = punish; - } - - public int getPersuade() { - return persuade; - } - - public void setPersuade(int persuade) { - this.persuade = persuade; - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java b/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java deleted file mode 100644 index 00b6a98..0000000 --- a/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.casic.dcms.model; - -import java.util.List; - -public class PunishTypeBean { - private int code; - private String message; - private boolean success; - private List data; - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - 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 List getData() { - return data; - } - - public void setData(List data) { - this.data = data; - } - - public static class DataBean { - /** - * punishTime : 2021-01-12 09:08:59 - * punishTypeName : 处罚 - * punishImage : images - * punishType : 1 - * punishRemarks : 处罚 - */ - - private String punishTime; - private String punishTypeName; - private String punishImage; - private String punishType; - private String punishRemarks; - - public String getPunishTime() { - return punishTime; - } - - public void setPunishTime(String punishTime) { - this.punishTime = punishTime; - } - - public String getPunishTypeName() { - return punishTypeName; - } - - public void setPunishTypeName(String punishTypeName) { - this.punishTypeName = punishTypeName; - } - - public String getPunishImage() { - return punishImage; - } - - public void setPunishImage(String punishImage) { - this.punishImage = punishImage; - } - - public String getPunishType() { - return punishType; - } - - public void setPunishType(String punishType) { - this.punishType = punishType; - } - - public String getPunishRemarks() { - return punishRemarks; - } - - public void setPunishRemarks(String punishRemarks) { - this.punishRemarks = punishRemarks; - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/UnitFeatureBean.java b/app/src/main/java/com/casic/dcms/model/UnitFeatureBean.java deleted file mode 100644 index a4d8337..0000000 --- a/app/src/main/java/com/casic/dcms/model/UnitFeatureBean.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.casic.dcms.model; - -public class UnitFeatureBean { - - private String BGID; - private String BGNAME; - private int OBJECTID; - - public String getBGID() { - return BGID; - } - - public void setBGID(String BGID) { - this.BGID = BGID; - } - - public String getBGNAME() { - return BGNAME; - } - - public void setBGNAME(String BGNAME) { - this.BGNAME = BGNAME; - } - - public int getOBJECTID() { - return OBJECTID; - } - - public void setOBJECTID(int OBJECTID) { - this.OBJECTID = OBJECTID; - } -} diff --git a/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java b/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java index 0578f7b..b0c24d5 100644 --- a/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java +++ b/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java @@ -1,9 +1,16 @@ package com.casic.dcms.model; +import android.os.Parcel; +import android.os.Parcelable; + +import androidx.annotation.NonNull; + import java.util.List; -public class WellAlarmListBean { - +/** + * Parcelable 是 Android 平台专门为性能优化而设计的序列化机制,通常比 Serializable 快 10 倍左右 + */ +public class WellAlarmListBean implements Parcelable { private int code; private DataBean data; private String message; @@ -41,7 +48,43 @@ this.success = success; } - public static class DataBean { + public WellAlarmListBean() { + + } + + protected WellAlarmListBean(Parcel in) { + code = in.readInt(); + data = in.readParcelable(DataBean.class.getClassLoader()); + message = in.readString(); + success = in.readByte() != 0; + } + + public static final Creator CREATOR = new Creator() { + @Override + public WellAlarmListBean createFromParcel(Parcel in) { + return new WellAlarmListBean(in); + } + + @Override + public WellAlarmListBean[] newArray(int size) { + return new WellAlarmListBean[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + dest.writeInt(code); + dest.writeParcelable(data, flags); + dest.writeString(message); + dest.writeByte((byte) (success ? 1 : 0)); + } + + public static class DataBean implements Parcelable { private int total; private List rows; @@ -62,7 +105,38 @@ this.rows = rows; } - public static class RowsBean { + public DataBean() { + } + + protected DataBean(Parcel in) { + total = in.readInt(); + rows = in.createTypedArrayList(RowsBean.CREATOR); + } + + public static final Creator CREATOR = new Creator() { + @Override + public DataBean createFromParcel(Parcel in) { + return new DataBean(in); + } + + @Override + public DataBean[] newArray(int size) { + return new DataBean[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(total); + dest.writeTypedList(rows); + } + + public static class RowsBean implements Parcelable { /** * alarmContent : 1 * deptName : 崇仁县城管局 @@ -296,6 +370,79 @@ public void setStatus(String status) { this.status = status; } + + public RowsBean() { + } + + protected RowsBean(Parcel in) { + alarmContent = in.readInt(); + deptName = in.readString(); + jobStatus = in.readString(); + alarmContentName = in.readString(); + wellCode = in.readString(); + alarmTime = in.readString(); + deptid = in.readString(); + alarmTypeName = in.readString(); + alarmMessage = in.readString(); + staff = in.readString(); + deviceId = in.readString(); + jobId = in.readString(); + jobStatusName = in.readString(); + alarmType = in.readString(); + alarmValue = in.readString(); + devcode = in.readString(); + statusName = in.readString(); + alarmLevel = in.readString(); + tel = in.readString(); + id = in.readString(); + wellId = in.readString(); + position = in.readString(); + status = in.readString(); + } + + public static final Creator CREATOR = new Creator() { + @Override + public RowsBean createFromParcel(Parcel in) { + return new RowsBean(in); + } + + @Override + public RowsBean[] newArray(int size) { + return new RowsBean[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(alarmContent); + dest.writeString(deptName); + dest.writeString(jobStatus); + dest.writeString(alarmContentName); + dest.writeString(wellCode); + dest.writeString(alarmTime); + dest.writeString(deptid); + dest.writeString(alarmTypeName); + dest.writeString(alarmMessage); + dest.writeString(staff); + dest.writeString(deviceId); + dest.writeString(jobId); + dest.writeString(jobStatusName); + dest.writeString(alarmType); + dest.writeString(alarmValue); + dest.writeString(devcode); + dest.writeString(statusName); + dest.writeString(alarmLevel); + dest.writeString(tel); + dest.writeString(id); + dest.writeString(wellId); + dest.writeString(position); + dest.writeString(status); + } } } } diff --git a/app/src/main/java/com/casic/dcms/model/WellDetailBean.java b/app/src/main/java/com/casic/dcms/model/WellDetailBean.java index cea8774..4e6c8fd 100644 --- a/app/src/main/java/com/casic/dcms/model/WellDetailBean.java +++ b/app/src/main/java/com/casic/dcms/model/WellDetailBean.java @@ -60,7 +60,6 @@ } public static class FieldAliasesBean { - private String objectid; private String 编号; private String 附属物编码; @@ -190,7 +189,6 @@ } public static class SpatialReferenceBean { - private int wkid; private int latestWkid; @@ -212,7 +210,6 @@ } public static class FieldsBean { - private String name; private String type; private String alias; @@ -252,7 +249,6 @@ } public static class FeaturesBean { - private AttributesBean attributes; private GeometryBean geometry; diff --git a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java index 8b15d77..6f1d941 100644 --- a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java @@ -621,8 +621,8 @@ /** * 报警列表 */ - public static Observable getAlarmList(int limit, int offset) { - return api.getAlarmList(AuthenticationHelper.getToken(), "1", limit, offset); + public static Observable getAlarmList(int offset) { + return api.getAlarmList(AuthenticationHelper.getToken(), "1", LocaleConstant.PAGE_LIMIT, offset); } /** @@ -662,18 +662,15 @@ return api.optionWellStatus(AuthenticationHelper.getToken(), bfzt); } + private static final RetrofitService arcgisApi = RetrofitFactory.createRetrofit( + "http://111.198.10.15:13002", RetrofitService.class, true + ); + /** * 报警窨井详情 */ public static Observable getWellDetailResult(String where) { -// Retrofit retrofit = new Retrofit.Builder() -// .baseUrl("http://111.198.10.15:13002") -// .addConverterFactory(GsonConverterFactory.create())//Gson转换器 -// .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) -// .client(createOKHttpClient())//log拦截器 -// .build(); -// RetrofitService service = retrofit.create(RetrofitService.class); - return api.getWellDetail( + return arcgisApi.getWellDetail( "json", "4326", "4326", "*", true, where ); } diff --git a/.gitignore b/.gitignore index f0f71e2..ee6b213 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,12 @@ *.iml .gradle /local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml +/.idea .DS_Store /build /captures .externalNativeBuild .cxx .idea +*.apk +*.json diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fdb7255..6873489 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -109,7 +109,7 @@ - + diff --git a/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java b/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java index 2dcdc64..0364fc7 100644 --- a/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java +++ b/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java @@ -9,6 +9,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; @@ -25,7 +26,6 @@ private final Context context; private final List dataRows; private final LayoutInflater layoutInflater; - private PunishTypeAdapter adapter; public PackageCaseListAdapter(Context context, List dataRows) { this.context = context; @@ -36,7 +36,7 @@ @NonNull @Override public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new ItemViewHolder(layoutInflater.inflate(R.layout.item_package_rv, parent, false)); + return new ItemViewHolder(layoutInflater.inflate(R.layout.item_package_rv_l, parent, false)); } @Override @@ -57,16 +57,67 @@ return dataRows.size(); } - @SuppressLint("NotifyDataSetChanged") - public void refresh(List dataRows) { - this.dataRows.clear(); - this.dataRows.addAll(dataRows); - notifyDataSetChanged(); + public void refresh(List newRows) { + DiffUtil.Callback diffCallback = new DiffUtil.Callback() { + + @Override + public int getOldListSize() { + return dataRows.size(); + } + + @Override + public int getNewListSize() { + return newRows.size(); + } + + @Override + public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { + if (dataRows == null || newRows == null) { + return false; + } + + // 检查索引是否在有效范围内 + if (oldItemPosition < 0 || oldItemPosition >= dataRows.size() || + newItemPosition < 0 || newItemPosition >= newRows.size()) { + return false; + } + + // 获取元素并进行比较 + Object oldItem = dataRows.get(oldItemPosition); + Object newItem = newRows.get(newItemPosition); + + // 处理空指针情况 + if (oldItem == null && newItem == null) { + return true; + } + if (oldItem == null || newItem == null) { + return false; + } + + return oldItem.equals(newItem); + } + + @Override + public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { + return dataRows.get(oldItemPosition) == newRows.get(newItemPosition); + } + }; + + DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallback); + + dataRows.clear(); + dataRows.addAll(newRows); + + diffResult.dispatchUpdatesTo(this); } - public void loadMore(List dataRows) { - this.dataRows.addAll(dataRows); - notifyItemRangeInserted(this.dataRows.size(), dataRows.size()); + public void loadMore(List newRows) { + if (newRows.isEmpty()) { + return; + } + int startPosition = this.dataRows.size(); + this.dataRows.addAll(newRows); + notifyItemRangeInserted(startPosition, newRows.size()); } class ItemViewHolder extends RecyclerView.ViewHolder { @@ -84,7 +135,6 @@ casePunishView = itemView.findViewById(R.id.casePunishView); } - void bindView(PackageCaseBean.DataBean.RowsBean rowsBean) { //三包核实图片 String fileIdVerify = rowsBean.getFileIdVerify(); @@ -97,45 +147,6 @@ } caseTitleView.setText(rowsBean.getDescription()); caseDateView.setText("上报时间:" + rowsBean.getReportTime()); -// HttpRequestHelper.doRequest(LocaleConstant.SHOP_PUNISH_LIST, rowsBean.getShopId(), new IHttpRequestListener() { -// @Override -// public void onSuccess(ResponseBody resultBean) { -// try { -// PunishTypeBean punishTypeBean = gson.fromJson(resultBean.string(), PunishTypeBean.class); -// if (punishTypeBean.getData().size() != 0) { -// //获取商铺处罚次数 -// HttpRequestHelper.doRequest(LocaleConstant.SHOP_PUNISH_TYPE, rowsBean.getShopId(), new IHttpRequestListener() { -// @Override -// public void onSuccess(ResponseBody resultBean) { -// try { -// PunishTimesBean punishTimesBean = gson.fromJson(resultBean.string(), PunishTimesBean.class); -// -// adapter = new PunishTypeAdapter(context, punishTypeBean.getData(), punishTimesBean.getData()); -// LinearLayoutManager layoutManager = new LinearLayoutManager(context); -// layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); -// punishRecyclerView.setLayoutManager(layoutManager); -// punishRecyclerView.setAdapter(adapter); -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } -// -// @Override -// public void onFailure(Throwable throwable) { -// -// } -// }); -// } -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } -// -// @Override -// public void onFailure(Throwable throwable) { -// -// } -// }); } } diff --git a/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java b/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java deleted file mode 100644 index 2e178e5..0000000 --- a/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.casic.dcms.adapter; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.core.content.ContextCompat; -import androidx.recyclerview.widget.RecyclerView; - -import com.casic.dcms.R; -import com.casic.dcms.model.PunishTimesBean; -import com.casic.dcms.model.PunishTypeBean; - -import java.util.List; - -@SuppressLint("SetTextI18n") -public class PunishTypeAdapter extends RecyclerView.Adapter { - - private final Context context; - private final List dataRows; - private final PunishTimesBean.DataBean dataBean; - private final LayoutInflater layoutInflater; - - PunishTypeAdapter(Context context, List dataRows, PunishTimesBean.DataBean dataBean) { - this.context = context; - this.dataRows = dataRows; - this.dataBean = dataBean; - this.layoutInflater = LayoutInflater.from(context); - } - - @NonNull - @Override - public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new ItemViewHolder(layoutInflater.inflate(R.layout.item_punish_recycleview, parent, false)); - } - - @Override - public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { - String typeName = dataRows.get(position).getPunishTypeName(); - int color, times; - switch (typeName) { - case "劝导": - times = dataBean.getPersuade(); - color = ContextCompat.getColor(context, R.color.persuadeColor); - break; - case "警告": - times = dataBean.getWarn(); - color = ContextCompat.getColor(context, R.color.warnColor); - break; - case "处罚": - times = dataBean.getPunish(); - color = ContextCompat.getColor(context, R.color.punishColor); - break; - default: - times = 0; - color = ContextCompat.getColor(context, R.color.mainThemeColor); - break; - } - if (times == 0) { - holder.punishTypeView.setVisibility(View.GONE); - } else { - holder.punishTypeView.setText(typeName + " x " + times); - holder.punishTypeView.setBackgroundColor(color); - } - } - - @Override - public int getItemCount() { - return dataRows.size(); - } - - static class ItemViewHolder extends RecyclerView.ViewHolder { - - private final TextView punishTypeView; - - ItemViewHolder(@NonNull View itemView) { - super(itemView); - punishTypeView = itemView.findViewById(R.id.punishTypeView); - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java b/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java deleted file mode 100644 index dc57ca3..0000000 --- a/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.dcms.model; - -public class PunishTimesBean { - 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 { - /** - * warn : 0 - * punish : 0 - * persuade : 0 - */ - - private int warn; - private int punish; - private int persuade; - - public int getWarn() { - return warn; - } - - public void setWarn(int warn) { - this.warn = warn; - } - - public int getPunish() { - return punish; - } - - public void setPunish(int punish) { - this.punish = punish; - } - - public int getPersuade() { - return persuade; - } - - public void setPersuade(int persuade) { - this.persuade = persuade; - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java b/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java deleted file mode 100644 index 00b6a98..0000000 --- a/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.casic.dcms.model; - -import java.util.List; - -public class PunishTypeBean { - private int code; - private String message; - private boolean success; - private List data; - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - 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 List getData() { - return data; - } - - public void setData(List data) { - this.data = data; - } - - public static class DataBean { - /** - * punishTime : 2021-01-12 09:08:59 - * punishTypeName : 处罚 - * punishImage : images - * punishType : 1 - * punishRemarks : 处罚 - */ - - private String punishTime; - private String punishTypeName; - private String punishImage; - private String punishType; - private String punishRemarks; - - public String getPunishTime() { - return punishTime; - } - - public void setPunishTime(String punishTime) { - this.punishTime = punishTime; - } - - public String getPunishTypeName() { - return punishTypeName; - } - - public void setPunishTypeName(String punishTypeName) { - this.punishTypeName = punishTypeName; - } - - public String getPunishImage() { - return punishImage; - } - - public void setPunishImage(String punishImage) { - this.punishImage = punishImage; - } - - public String getPunishType() { - return punishType; - } - - public void setPunishType(String punishType) { - this.punishType = punishType; - } - - public String getPunishRemarks() { - return punishRemarks; - } - - public void setPunishRemarks(String punishRemarks) { - this.punishRemarks = punishRemarks; - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/UnitFeatureBean.java b/app/src/main/java/com/casic/dcms/model/UnitFeatureBean.java deleted file mode 100644 index a4d8337..0000000 --- a/app/src/main/java/com/casic/dcms/model/UnitFeatureBean.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.casic.dcms.model; - -public class UnitFeatureBean { - - private String BGID; - private String BGNAME; - private int OBJECTID; - - public String getBGID() { - return BGID; - } - - public void setBGID(String BGID) { - this.BGID = BGID; - } - - public String getBGNAME() { - return BGNAME; - } - - public void setBGNAME(String BGNAME) { - this.BGNAME = BGNAME; - } - - public int getOBJECTID() { - return OBJECTID; - } - - public void setOBJECTID(int OBJECTID) { - this.OBJECTID = OBJECTID; - } -} diff --git a/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java b/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java index 0578f7b..b0c24d5 100644 --- a/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java +++ b/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java @@ -1,9 +1,16 @@ package com.casic.dcms.model; +import android.os.Parcel; +import android.os.Parcelable; + +import androidx.annotation.NonNull; + import java.util.List; -public class WellAlarmListBean { - +/** + * Parcelable 是 Android 平台专门为性能优化而设计的序列化机制,通常比 Serializable 快 10 倍左右 + */ +public class WellAlarmListBean implements Parcelable { private int code; private DataBean data; private String message; @@ -41,7 +48,43 @@ this.success = success; } - public static class DataBean { + public WellAlarmListBean() { + + } + + protected WellAlarmListBean(Parcel in) { + code = in.readInt(); + data = in.readParcelable(DataBean.class.getClassLoader()); + message = in.readString(); + success = in.readByte() != 0; + } + + public static final Creator CREATOR = new Creator() { + @Override + public WellAlarmListBean createFromParcel(Parcel in) { + return new WellAlarmListBean(in); + } + + @Override + public WellAlarmListBean[] newArray(int size) { + return new WellAlarmListBean[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + dest.writeInt(code); + dest.writeParcelable(data, flags); + dest.writeString(message); + dest.writeByte((byte) (success ? 1 : 0)); + } + + public static class DataBean implements Parcelable { private int total; private List rows; @@ -62,7 +105,38 @@ this.rows = rows; } - public static class RowsBean { + public DataBean() { + } + + protected DataBean(Parcel in) { + total = in.readInt(); + rows = in.createTypedArrayList(RowsBean.CREATOR); + } + + public static final Creator CREATOR = new Creator() { + @Override + public DataBean createFromParcel(Parcel in) { + return new DataBean(in); + } + + @Override + public DataBean[] newArray(int size) { + return new DataBean[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(total); + dest.writeTypedList(rows); + } + + public static class RowsBean implements Parcelable { /** * alarmContent : 1 * deptName : 崇仁县城管局 @@ -296,6 +370,79 @@ public void setStatus(String status) { this.status = status; } + + public RowsBean() { + } + + protected RowsBean(Parcel in) { + alarmContent = in.readInt(); + deptName = in.readString(); + jobStatus = in.readString(); + alarmContentName = in.readString(); + wellCode = in.readString(); + alarmTime = in.readString(); + deptid = in.readString(); + alarmTypeName = in.readString(); + alarmMessage = in.readString(); + staff = in.readString(); + deviceId = in.readString(); + jobId = in.readString(); + jobStatusName = in.readString(); + alarmType = in.readString(); + alarmValue = in.readString(); + devcode = in.readString(); + statusName = in.readString(); + alarmLevel = in.readString(); + tel = in.readString(); + id = in.readString(); + wellId = in.readString(); + position = in.readString(); + status = in.readString(); + } + + public static final Creator CREATOR = new Creator() { + @Override + public RowsBean createFromParcel(Parcel in) { + return new RowsBean(in); + } + + @Override + public RowsBean[] newArray(int size) { + return new RowsBean[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(alarmContent); + dest.writeString(deptName); + dest.writeString(jobStatus); + dest.writeString(alarmContentName); + dest.writeString(wellCode); + dest.writeString(alarmTime); + dest.writeString(deptid); + dest.writeString(alarmTypeName); + dest.writeString(alarmMessage); + dest.writeString(staff); + dest.writeString(deviceId); + dest.writeString(jobId); + dest.writeString(jobStatusName); + dest.writeString(alarmType); + dest.writeString(alarmValue); + dest.writeString(devcode); + dest.writeString(statusName); + dest.writeString(alarmLevel); + dest.writeString(tel); + dest.writeString(id); + dest.writeString(wellId); + dest.writeString(position); + dest.writeString(status); + } } } } diff --git a/app/src/main/java/com/casic/dcms/model/WellDetailBean.java b/app/src/main/java/com/casic/dcms/model/WellDetailBean.java index cea8774..4e6c8fd 100644 --- a/app/src/main/java/com/casic/dcms/model/WellDetailBean.java +++ b/app/src/main/java/com/casic/dcms/model/WellDetailBean.java @@ -60,7 +60,6 @@ } public static class FieldAliasesBean { - private String objectid; private String 编号; private String 附属物编码; @@ -190,7 +189,6 @@ } public static class SpatialReferenceBean { - private int wkid; private int latestWkid; @@ -212,7 +210,6 @@ } public static class FieldsBean { - private String name; private String type; private String alias; @@ -252,7 +249,6 @@ } public static class FeaturesBean { - private AttributesBean attributes; private GeometryBean geometry; diff --git a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java index 8b15d77..6f1d941 100644 --- a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java @@ -621,8 +621,8 @@ /** * 报警列表 */ - public static Observable getAlarmList(int limit, int offset) { - return api.getAlarmList(AuthenticationHelper.getToken(), "1", limit, offset); + public static Observable getAlarmList(int offset) { + return api.getAlarmList(AuthenticationHelper.getToken(), "1", LocaleConstant.PAGE_LIMIT, offset); } /** @@ -662,18 +662,15 @@ return api.optionWellStatus(AuthenticationHelper.getToken(), bfzt); } + private static final RetrofitService arcgisApi = RetrofitFactory.createRetrofit( + "http://111.198.10.15:13002", RetrofitService.class, true + ); + /** * 报警窨井详情 */ public static Observable getWellDetailResult(String where) { -// Retrofit retrofit = new Retrofit.Builder() -// .baseUrl("http://111.198.10.15:13002") -// .addConverterFactory(GsonConverterFactory.create())//Gson转换器 -// .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) -// .client(createOKHttpClient())//log拦截器 -// .build(); -// RetrofitService service = retrofit.create(RetrofitService.class); - return api.getWellDetail( + return arcgisApi.getWellDetail( "json", "4326", "4326", "*", true, where ); } diff --git a/app/src/main/java/com/casic/dcms/view/pipeline/AlarmOnMapActivity.java b/app/src/main/java/com/casic/dcms/view/pipeline/AlarmOnMapActivity.java new file mode 100644 index 0000000..e3dc01d --- /dev/null +++ b/app/src/main/java/com/casic/dcms/view/pipeline/AlarmOnMapActivity.java @@ -0,0 +1,212 @@ +package com.casic.dcms.view.pipeline; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.DialogInterface; +import android.graphics.Color; +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; + +import com.casic.dcms.R; +import com.casic.dcms.databinding.ActivityMapAlarmBinding; +import com.casic.dcms.model.WellAlarmListBean; +import com.casic.dcms.model.WellDetailBean; +import com.casic.dcms.utils.ArcGisMapCreator; +import com.casic.dcms.utils.LocaleConstant; +import com.casic.dcms.utils.ViewGroupKit; +import com.casic.dcms.vm.WellViewModel; +import com.esri.arcgisruntime.geometry.Point; +import com.esri.arcgisruntime.mapping.ArcGISMap; +import com.esri.arcgisruntime.mapping.Basemap; +import com.esri.arcgisruntime.mapping.BasemapStyle; +import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; +import com.esri.arcgisruntime.mapping.view.Graphic; +import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; +import com.esri.arcgisruntime.symbology.SimpleMarkerSymbol; +import com.esri.arcgisruntime.util.ListenableList; +import com.pengxh.androidx.lite.base.AndroidxBaseActivity; +import com.pengxh.androidx.lite.utils.LoadState; +import com.pengxh.androidx.lite.utils.LoadingDialog; +import com.pengxh.androidx.lite.widget.TitleBarView; +import com.qmuiteam.qmui.util.QMUIDisplayHelper; +import com.qmuiteam.qmui.widget.dialog.QMUIDialog; +import com.qmuiteam.qmui.widget.popup.QMUIPopup; +import com.qmuiteam.qmui.widget.popup.QMUIPopups; + +import java.util.ArrayList; +import java.util.List; + +public class AlarmOnMapActivity extends AndroidxBaseActivity { + + private static final String TAG = "AlarmOnMapActivity"; + private final Context context = this; + private final List geometryList = new ArrayList<>(); + private WellViewModel wellViewModel; + + @Override + protected void setupTopBarLayout() { + ViewGroupKit.initImmersionBar(binding.rootView, this, true, R.color.white); + binding.titleView.setOnClickListener(new TitleBarView.OnClickListener() { + @Override + public void onLeftClick() { + finish(); + } + + @Override + public void onRightClick() { + + } + }); + } + + @Override + protected void observeRequestState() { + wellViewModel.loadState.observe(this, new Observer() { + @Override + public void onChanged(LoadState loadState) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(AlarmOnMapActivity.this, "数据加载中,请稍后"); + } else { + LoadingDialog.dismiss(); + } + } + }); + } + + @Override + public void initOnCreate(@Nullable Bundle savedInstanceState) { + binding.mapView.setAttributionTextVisible(false);//去掉左下角属性标识 + binding.mapView.setViewpointScaleAsync(64000); + ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_STREETS); + //创建底图、并设置底图图层 + Basemap basemap = new Basemap(ArcGisMapCreator.createNoGridLayer()); + arcGISMap.setBasemap(basemap); + binding.mapView.setMap(arcGISMap); + + wellViewModel = new ViewModelProvider(this).get(WellViewModel.class); + wellViewModel.resultModel.observe(this, new Observer() { + @Override + public void onChanged(WellDetailBean wellDetailBean) { + List features = wellDetailBean.getFeatures(); + if (features.size() > 0) { + WellDetailBean.FeaturesBean featuresBean = features.get(0); + //将获取到的井数据缓存起来 + geometryList.add(featuresBean); + WellDetailBean.FeaturesBean.GeometryBean geometryBean = featuresBean.getGeometry(); + //每获取一个点就绘制出 + addMarker(new Point(geometryBean.getX(), geometryBean.getY())); + } + } + }); + + Bundle extras = getIntent().getExtras(); + if (extras != null) { + List dataBeans = extras.getParcelableArrayList("rows_list"); + if (dataBeans == null) { + return; + } + for (WellAlarmListBean.DataBean.RowsBean dataBean : dataBeans) { + String queryParam = "编号='" + dataBean.getWellCode() + "'"; + Log.d(TAG, "queryParam: " + queryParam); + wellViewModel.getWellDetail(context, queryParam); + } + } + } + + @SuppressLint("ClickableViewAccessibility") + @Override + public void initEvent() { + binding.expandMapView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 0.5); + } + }); + binding.minusMapView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 2); + } + }); + + binding.mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, binding.mapView) { + @Override + public boolean onSingleTapConfirmed(MotionEvent e) { + android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); + Point clickPoint = binding.mapView.screenToLocation(screenPoint); + if (geometryList.size() > 0) { + List tempList = new ArrayList<>(); + for (WellDetailBean.FeaturesBean featuresBean : geometryList) { + WellDetailBean.FeaturesBean.GeometryBean dataBean = featuresBean.getGeometry(); + if (Math.abs(dataBean.getX() - clickPoint.getX()) <= 10 * LocaleConstant.DELTA_LNG_10 && + Math.abs(dataBean.getY() - clickPoint.getY()) <= 10 * LocaleConstant.DELTA_LNG_10) { + tempList.add(featuresBean); + } + } + if (tempList.size() > 0) { + QMUIDialog.MenuDialogBuilder menuDialogBuilder = new QMUIDialog.MenuDialogBuilder(context); + menuDialogBuilder.setTitle("请选择您要查看的窨井"); + for (WellDetailBean.FeaturesBean dataBean : tempList) { + menuDialogBuilder.addItem(dataBean.getAttributes().get编号(), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + + View popupView = LayoutInflater.from(context).inflate(R.layout.popu_well, null); + TextView wellCodeView = popupView.findViewById(R.id.wellCodeView); + TextView wellTypeView = popupView.findViewById(R.id.wellTypeView); + TextView wellPositionView = popupView.findViewById(R.id.wellPositionView); + + WellDetailBean.FeaturesBean.AttributesBean attributes = dataBean.getAttributes(); + wellCodeView.setText(attributes.get编号()); + wellTypeView.setText(attributes.get附属物名称()); + wellPositionView.setText(attributes.get所属道路()); + + QMUIPopups.popup(context, QMUIDisplayHelper.dp2px(context, 290)) + .preferredDirection(QMUIPopup.DIRECTION_BOTTOM) + .view(popupView) + .edgeProtection(QMUIDisplayHelper.dp2px(context, 20)) + .dimAmount(0.6f) + .animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER) + .onDismiss(null) + .show(binding.mapView); + } + }); + } + menuDialogBuilder.create().show(); + } + } + return super.onSingleTapConfirmed(e); + } + }); + } + + protected void onResume() { + super.onResume(); + binding.mapView.resume(); + } + + @Override + protected void onPause() { + super.onPause(); + binding.mapView.pause(); + } + + private void addMarker(Point point) { + SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.RED, 10); + Graphic graphic = new Graphic(point, simpleMarkerSymbol); + GraphicsOverlay mGraphicsOverlay = new GraphicsOverlay(); + ListenableList overlayGraphics = mGraphicsOverlay.getGraphics(); + ListenableList graphicsOverlays = binding.mapView.getGraphicsOverlays(); + overlayGraphics.add(graphic); + graphicsOverlays.add(mGraphicsOverlay); + } +} diff --git a/.gitignore b/.gitignore index f0f71e2..ee6b213 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,12 @@ *.iml .gradle /local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml +/.idea .DS_Store /build /captures .externalNativeBuild .cxx .idea +*.apk +*.json diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fdb7255..6873489 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -109,7 +109,7 @@ - + diff --git a/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java b/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java index 2dcdc64..0364fc7 100644 --- a/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java +++ b/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java @@ -9,6 +9,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; @@ -25,7 +26,6 @@ private final Context context; private final List dataRows; private final LayoutInflater layoutInflater; - private PunishTypeAdapter adapter; public PackageCaseListAdapter(Context context, List dataRows) { this.context = context; @@ -36,7 +36,7 @@ @NonNull @Override public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new ItemViewHolder(layoutInflater.inflate(R.layout.item_package_rv, parent, false)); + return new ItemViewHolder(layoutInflater.inflate(R.layout.item_package_rv_l, parent, false)); } @Override @@ -57,16 +57,67 @@ return dataRows.size(); } - @SuppressLint("NotifyDataSetChanged") - public void refresh(List dataRows) { - this.dataRows.clear(); - this.dataRows.addAll(dataRows); - notifyDataSetChanged(); + public void refresh(List newRows) { + DiffUtil.Callback diffCallback = new DiffUtil.Callback() { + + @Override + public int getOldListSize() { + return dataRows.size(); + } + + @Override + public int getNewListSize() { + return newRows.size(); + } + + @Override + public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { + if (dataRows == null || newRows == null) { + return false; + } + + // 检查索引是否在有效范围内 + if (oldItemPosition < 0 || oldItemPosition >= dataRows.size() || + newItemPosition < 0 || newItemPosition >= newRows.size()) { + return false; + } + + // 获取元素并进行比较 + Object oldItem = dataRows.get(oldItemPosition); + Object newItem = newRows.get(newItemPosition); + + // 处理空指针情况 + if (oldItem == null && newItem == null) { + return true; + } + if (oldItem == null || newItem == null) { + return false; + } + + return oldItem.equals(newItem); + } + + @Override + public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { + return dataRows.get(oldItemPosition) == newRows.get(newItemPosition); + } + }; + + DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallback); + + dataRows.clear(); + dataRows.addAll(newRows); + + diffResult.dispatchUpdatesTo(this); } - public void loadMore(List dataRows) { - this.dataRows.addAll(dataRows); - notifyItemRangeInserted(this.dataRows.size(), dataRows.size()); + public void loadMore(List newRows) { + if (newRows.isEmpty()) { + return; + } + int startPosition = this.dataRows.size(); + this.dataRows.addAll(newRows); + notifyItemRangeInserted(startPosition, newRows.size()); } class ItemViewHolder extends RecyclerView.ViewHolder { @@ -84,7 +135,6 @@ casePunishView = itemView.findViewById(R.id.casePunishView); } - void bindView(PackageCaseBean.DataBean.RowsBean rowsBean) { //三包核实图片 String fileIdVerify = rowsBean.getFileIdVerify(); @@ -97,45 +147,6 @@ } caseTitleView.setText(rowsBean.getDescription()); caseDateView.setText("上报时间:" + rowsBean.getReportTime()); -// HttpRequestHelper.doRequest(LocaleConstant.SHOP_PUNISH_LIST, rowsBean.getShopId(), new IHttpRequestListener() { -// @Override -// public void onSuccess(ResponseBody resultBean) { -// try { -// PunishTypeBean punishTypeBean = gson.fromJson(resultBean.string(), PunishTypeBean.class); -// if (punishTypeBean.getData().size() != 0) { -// //获取商铺处罚次数 -// HttpRequestHelper.doRequest(LocaleConstant.SHOP_PUNISH_TYPE, rowsBean.getShopId(), new IHttpRequestListener() { -// @Override -// public void onSuccess(ResponseBody resultBean) { -// try { -// PunishTimesBean punishTimesBean = gson.fromJson(resultBean.string(), PunishTimesBean.class); -// -// adapter = new PunishTypeAdapter(context, punishTypeBean.getData(), punishTimesBean.getData()); -// LinearLayoutManager layoutManager = new LinearLayoutManager(context); -// layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); -// punishRecyclerView.setLayoutManager(layoutManager); -// punishRecyclerView.setAdapter(adapter); -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } -// -// @Override -// public void onFailure(Throwable throwable) { -// -// } -// }); -// } -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } -// -// @Override -// public void onFailure(Throwable throwable) { -// -// } -// }); } } diff --git a/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java b/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java deleted file mode 100644 index 2e178e5..0000000 --- a/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.casic.dcms.adapter; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.core.content.ContextCompat; -import androidx.recyclerview.widget.RecyclerView; - -import com.casic.dcms.R; -import com.casic.dcms.model.PunishTimesBean; -import com.casic.dcms.model.PunishTypeBean; - -import java.util.List; - -@SuppressLint("SetTextI18n") -public class PunishTypeAdapter extends RecyclerView.Adapter { - - private final Context context; - private final List dataRows; - private final PunishTimesBean.DataBean dataBean; - private final LayoutInflater layoutInflater; - - PunishTypeAdapter(Context context, List dataRows, PunishTimesBean.DataBean dataBean) { - this.context = context; - this.dataRows = dataRows; - this.dataBean = dataBean; - this.layoutInflater = LayoutInflater.from(context); - } - - @NonNull - @Override - public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new ItemViewHolder(layoutInflater.inflate(R.layout.item_punish_recycleview, parent, false)); - } - - @Override - public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { - String typeName = dataRows.get(position).getPunishTypeName(); - int color, times; - switch (typeName) { - case "劝导": - times = dataBean.getPersuade(); - color = ContextCompat.getColor(context, R.color.persuadeColor); - break; - case "警告": - times = dataBean.getWarn(); - color = ContextCompat.getColor(context, R.color.warnColor); - break; - case "处罚": - times = dataBean.getPunish(); - color = ContextCompat.getColor(context, R.color.punishColor); - break; - default: - times = 0; - color = ContextCompat.getColor(context, R.color.mainThemeColor); - break; - } - if (times == 0) { - holder.punishTypeView.setVisibility(View.GONE); - } else { - holder.punishTypeView.setText(typeName + " x " + times); - holder.punishTypeView.setBackgroundColor(color); - } - } - - @Override - public int getItemCount() { - return dataRows.size(); - } - - static class ItemViewHolder extends RecyclerView.ViewHolder { - - private final TextView punishTypeView; - - ItemViewHolder(@NonNull View itemView) { - super(itemView); - punishTypeView = itemView.findViewById(R.id.punishTypeView); - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java b/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java deleted file mode 100644 index dc57ca3..0000000 --- a/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.dcms.model; - -public class PunishTimesBean { - 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 { - /** - * warn : 0 - * punish : 0 - * persuade : 0 - */ - - private int warn; - private int punish; - private int persuade; - - public int getWarn() { - return warn; - } - - public void setWarn(int warn) { - this.warn = warn; - } - - public int getPunish() { - return punish; - } - - public void setPunish(int punish) { - this.punish = punish; - } - - public int getPersuade() { - return persuade; - } - - public void setPersuade(int persuade) { - this.persuade = persuade; - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java b/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java deleted file mode 100644 index 00b6a98..0000000 --- a/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.casic.dcms.model; - -import java.util.List; - -public class PunishTypeBean { - private int code; - private String message; - private boolean success; - private List data; - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - 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 List getData() { - return data; - } - - public void setData(List data) { - this.data = data; - } - - public static class DataBean { - /** - * punishTime : 2021-01-12 09:08:59 - * punishTypeName : 处罚 - * punishImage : images - * punishType : 1 - * punishRemarks : 处罚 - */ - - private String punishTime; - private String punishTypeName; - private String punishImage; - private String punishType; - private String punishRemarks; - - public String getPunishTime() { - return punishTime; - } - - public void setPunishTime(String punishTime) { - this.punishTime = punishTime; - } - - public String getPunishTypeName() { - return punishTypeName; - } - - public void setPunishTypeName(String punishTypeName) { - this.punishTypeName = punishTypeName; - } - - public String getPunishImage() { - return punishImage; - } - - public void setPunishImage(String punishImage) { - this.punishImage = punishImage; - } - - public String getPunishType() { - return punishType; - } - - public void setPunishType(String punishType) { - this.punishType = punishType; - } - - public String getPunishRemarks() { - return punishRemarks; - } - - public void setPunishRemarks(String punishRemarks) { - this.punishRemarks = punishRemarks; - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/UnitFeatureBean.java b/app/src/main/java/com/casic/dcms/model/UnitFeatureBean.java deleted file mode 100644 index a4d8337..0000000 --- a/app/src/main/java/com/casic/dcms/model/UnitFeatureBean.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.casic.dcms.model; - -public class UnitFeatureBean { - - private String BGID; - private String BGNAME; - private int OBJECTID; - - public String getBGID() { - return BGID; - } - - public void setBGID(String BGID) { - this.BGID = BGID; - } - - public String getBGNAME() { - return BGNAME; - } - - public void setBGNAME(String BGNAME) { - this.BGNAME = BGNAME; - } - - public int getOBJECTID() { - return OBJECTID; - } - - public void setOBJECTID(int OBJECTID) { - this.OBJECTID = OBJECTID; - } -} diff --git a/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java b/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java index 0578f7b..b0c24d5 100644 --- a/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java +++ b/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java @@ -1,9 +1,16 @@ package com.casic.dcms.model; +import android.os.Parcel; +import android.os.Parcelable; + +import androidx.annotation.NonNull; + import java.util.List; -public class WellAlarmListBean { - +/** + * Parcelable 是 Android 平台专门为性能优化而设计的序列化机制,通常比 Serializable 快 10 倍左右 + */ +public class WellAlarmListBean implements Parcelable { private int code; private DataBean data; private String message; @@ -41,7 +48,43 @@ this.success = success; } - public static class DataBean { + public WellAlarmListBean() { + + } + + protected WellAlarmListBean(Parcel in) { + code = in.readInt(); + data = in.readParcelable(DataBean.class.getClassLoader()); + message = in.readString(); + success = in.readByte() != 0; + } + + public static final Creator CREATOR = new Creator() { + @Override + public WellAlarmListBean createFromParcel(Parcel in) { + return new WellAlarmListBean(in); + } + + @Override + public WellAlarmListBean[] newArray(int size) { + return new WellAlarmListBean[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + dest.writeInt(code); + dest.writeParcelable(data, flags); + dest.writeString(message); + dest.writeByte((byte) (success ? 1 : 0)); + } + + public static class DataBean implements Parcelable { private int total; private List rows; @@ -62,7 +105,38 @@ this.rows = rows; } - public static class RowsBean { + public DataBean() { + } + + protected DataBean(Parcel in) { + total = in.readInt(); + rows = in.createTypedArrayList(RowsBean.CREATOR); + } + + public static final Creator CREATOR = new Creator() { + @Override + public DataBean createFromParcel(Parcel in) { + return new DataBean(in); + } + + @Override + public DataBean[] newArray(int size) { + return new DataBean[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(total); + dest.writeTypedList(rows); + } + + public static class RowsBean implements Parcelable { /** * alarmContent : 1 * deptName : 崇仁县城管局 @@ -296,6 +370,79 @@ public void setStatus(String status) { this.status = status; } + + public RowsBean() { + } + + protected RowsBean(Parcel in) { + alarmContent = in.readInt(); + deptName = in.readString(); + jobStatus = in.readString(); + alarmContentName = in.readString(); + wellCode = in.readString(); + alarmTime = in.readString(); + deptid = in.readString(); + alarmTypeName = in.readString(); + alarmMessage = in.readString(); + staff = in.readString(); + deviceId = in.readString(); + jobId = in.readString(); + jobStatusName = in.readString(); + alarmType = in.readString(); + alarmValue = in.readString(); + devcode = in.readString(); + statusName = in.readString(); + alarmLevel = in.readString(); + tel = in.readString(); + id = in.readString(); + wellId = in.readString(); + position = in.readString(); + status = in.readString(); + } + + public static final Creator CREATOR = new Creator() { + @Override + public RowsBean createFromParcel(Parcel in) { + return new RowsBean(in); + } + + @Override + public RowsBean[] newArray(int size) { + return new RowsBean[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(alarmContent); + dest.writeString(deptName); + dest.writeString(jobStatus); + dest.writeString(alarmContentName); + dest.writeString(wellCode); + dest.writeString(alarmTime); + dest.writeString(deptid); + dest.writeString(alarmTypeName); + dest.writeString(alarmMessage); + dest.writeString(staff); + dest.writeString(deviceId); + dest.writeString(jobId); + dest.writeString(jobStatusName); + dest.writeString(alarmType); + dest.writeString(alarmValue); + dest.writeString(devcode); + dest.writeString(statusName); + dest.writeString(alarmLevel); + dest.writeString(tel); + dest.writeString(id); + dest.writeString(wellId); + dest.writeString(position); + dest.writeString(status); + } } } } diff --git a/app/src/main/java/com/casic/dcms/model/WellDetailBean.java b/app/src/main/java/com/casic/dcms/model/WellDetailBean.java index cea8774..4e6c8fd 100644 --- a/app/src/main/java/com/casic/dcms/model/WellDetailBean.java +++ b/app/src/main/java/com/casic/dcms/model/WellDetailBean.java @@ -60,7 +60,6 @@ } public static class FieldAliasesBean { - private String objectid; private String 编号; private String 附属物编码; @@ -190,7 +189,6 @@ } public static class SpatialReferenceBean { - private int wkid; private int latestWkid; @@ -212,7 +210,6 @@ } public static class FieldsBean { - private String name; private String type; private String alias; @@ -252,7 +249,6 @@ } public static class FeaturesBean { - private AttributesBean attributes; private GeometryBean geometry; diff --git a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java index 8b15d77..6f1d941 100644 --- a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java @@ -621,8 +621,8 @@ /** * 报警列表 */ - public static Observable getAlarmList(int limit, int offset) { - return api.getAlarmList(AuthenticationHelper.getToken(), "1", limit, offset); + public static Observable getAlarmList(int offset) { + return api.getAlarmList(AuthenticationHelper.getToken(), "1", LocaleConstant.PAGE_LIMIT, offset); } /** @@ -662,18 +662,15 @@ return api.optionWellStatus(AuthenticationHelper.getToken(), bfzt); } + private static final RetrofitService arcgisApi = RetrofitFactory.createRetrofit( + "http://111.198.10.15:13002", RetrofitService.class, true + ); + /** * 报警窨井详情 */ public static Observable getWellDetailResult(String where) { -// Retrofit retrofit = new Retrofit.Builder() -// .baseUrl("http://111.198.10.15:13002") -// .addConverterFactory(GsonConverterFactory.create())//Gson转换器 -// .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) -// .client(createOKHttpClient())//log拦截器 -// .build(); -// RetrofitService service = retrofit.create(RetrofitService.class); - return api.getWellDetail( + return arcgisApi.getWellDetail( "json", "4326", "4326", "*", true, where ); } diff --git a/app/src/main/java/com/casic/dcms/view/pipeline/AlarmOnMapActivity.java b/app/src/main/java/com/casic/dcms/view/pipeline/AlarmOnMapActivity.java new file mode 100644 index 0000000..e3dc01d --- /dev/null +++ b/app/src/main/java/com/casic/dcms/view/pipeline/AlarmOnMapActivity.java @@ -0,0 +1,212 @@ +package com.casic.dcms.view.pipeline; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.DialogInterface; +import android.graphics.Color; +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; + +import com.casic.dcms.R; +import com.casic.dcms.databinding.ActivityMapAlarmBinding; +import com.casic.dcms.model.WellAlarmListBean; +import com.casic.dcms.model.WellDetailBean; +import com.casic.dcms.utils.ArcGisMapCreator; +import com.casic.dcms.utils.LocaleConstant; +import com.casic.dcms.utils.ViewGroupKit; +import com.casic.dcms.vm.WellViewModel; +import com.esri.arcgisruntime.geometry.Point; +import com.esri.arcgisruntime.mapping.ArcGISMap; +import com.esri.arcgisruntime.mapping.Basemap; +import com.esri.arcgisruntime.mapping.BasemapStyle; +import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; +import com.esri.arcgisruntime.mapping.view.Graphic; +import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; +import com.esri.arcgisruntime.symbology.SimpleMarkerSymbol; +import com.esri.arcgisruntime.util.ListenableList; +import com.pengxh.androidx.lite.base.AndroidxBaseActivity; +import com.pengxh.androidx.lite.utils.LoadState; +import com.pengxh.androidx.lite.utils.LoadingDialog; +import com.pengxh.androidx.lite.widget.TitleBarView; +import com.qmuiteam.qmui.util.QMUIDisplayHelper; +import com.qmuiteam.qmui.widget.dialog.QMUIDialog; +import com.qmuiteam.qmui.widget.popup.QMUIPopup; +import com.qmuiteam.qmui.widget.popup.QMUIPopups; + +import java.util.ArrayList; +import java.util.List; + +public class AlarmOnMapActivity extends AndroidxBaseActivity { + + private static final String TAG = "AlarmOnMapActivity"; + private final Context context = this; + private final List geometryList = new ArrayList<>(); + private WellViewModel wellViewModel; + + @Override + protected void setupTopBarLayout() { + ViewGroupKit.initImmersionBar(binding.rootView, this, true, R.color.white); + binding.titleView.setOnClickListener(new TitleBarView.OnClickListener() { + @Override + public void onLeftClick() { + finish(); + } + + @Override + public void onRightClick() { + + } + }); + } + + @Override + protected void observeRequestState() { + wellViewModel.loadState.observe(this, new Observer() { + @Override + public void onChanged(LoadState loadState) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(AlarmOnMapActivity.this, "数据加载中,请稍后"); + } else { + LoadingDialog.dismiss(); + } + } + }); + } + + @Override + public void initOnCreate(@Nullable Bundle savedInstanceState) { + binding.mapView.setAttributionTextVisible(false);//去掉左下角属性标识 + binding.mapView.setViewpointScaleAsync(64000); + ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_STREETS); + //创建底图、并设置底图图层 + Basemap basemap = new Basemap(ArcGisMapCreator.createNoGridLayer()); + arcGISMap.setBasemap(basemap); + binding.mapView.setMap(arcGISMap); + + wellViewModel = new ViewModelProvider(this).get(WellViewModel.class); + wellViewModel.resultModel.observe(this, new Observer() { + @Override + public void onChanged(WellDetailBean wellDetailBean) { + List features = wellDetailBean.getFeatures(); + if (features.size() > 0) { + WellDetailBean.FeaturesBean featuresBean = features.get(0); + //将获取到的井数据缓存起来 + geometryList.add(featuresBean); + WellDetailBean.FeaturesBean.GeometryBean geometryBean = featuresBean.getGeometry(); + //每获取一个点就绘制出 + addMarker(new Point(geometryBean.getX(), geometryBean.getY())); + } + } + }); + + Bundle extras = getIntent().getExtras(); + if (extras != null) { + List dataBeans = extras.getParcelableArrayList("rows_list"); + if (dataBeans == null) { + return; + } + for (WellAlarmListBean.DataBean.RowsBean dataBean : dataBeans) { + String queryParam = "编号='" + dataBean.getWellCode() + "'"; + Log.d(TAG, "queryParam: " + queryParam); + wellViewModel.getWellDetail(context, queryParam); + } + } + } + + @SuppressLint("ClickableViewAccessibility") + @Override + public void initEvent() { + binding.expandMapView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 0.5); + } + }); + binding.minusMapView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 2); + } + }); + + binding.mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, binding.mapView) { + @Override + public boolean onSingleTapConfirmed(MotionEvent e) { + android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); + Point clickPoint = binding.mapView.screenToLocation(screenPoint); + if (geometryList.size() > 0) { + List tempList = new ArrayList<>(); + for (WellDetailBean.FeaturesBean featuresBean : geometryList) { + WellDetailBean.FeaturesBean.GeometryBean dataBean = featuresBean.getGeometry(); + if (Math.abs(dataBean.getX() - clickPoint.getX()) <= 10 * LocaleConstant.DELTA_LNG_10 && + Math.abs(dataBean.getY() - clickPoint.getY()) <= 10 * LocaleConstant.DELTA_LNG_10) { + tempList.add(featuresBean); + } + } + if (tempList.size() > 0) { + QMUIDialog.MenuDialogBuilder menuDialogBuilder = new QMUIDialog.MenuDialogBuilder(context); + menuDialogBuilder.setTitle("请选择您要查看的窨井"); + for (WellDetailBean.FeaturesBean dataBean : tempList) { + menuDialogBuilder.addItem(dataBean.getAttributes().get编号(), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + + View popupView = LayoutInflater.from(context).inflate(R.layout.popu_well, null); + TextView wellCodeView = popupView.findViewById(R.id.wellCodeView); + TextView wellTypeView = popupView.findViewById(R.id.wellTypeView); + TextView wellPositionView = popupView.findViewById(R.id.wellPositionView); + + WellDetailBean.FeaturesBean.AttributesBean attributes = dataBean.getAttributes(); + wellCodeView.setText(attributes.get编号()); + wellTypeView.setText(attributes.get附属物名称()); + wellPositionView.setText(attributes.get所属道路()); + + QMUIPopups.popup(context, QMUIDisplayHelper.dp2px(context, 290)) + .preferredDirection(QMUIPopup.DIRECTION_BOTTOM) + .view(popupView) + .edgeProtection(QMUIDisplayHelper.dp2px(context, 20)) + .dimAmount(0.6f) + .animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER) + .onDismiss(null) + .show(binding.mapView); + } + }); + } + menuDialogBuilder.create().show(); + } + } + return super.onSingleTapConfirmed(e); + } + }); + } + + protected void onResume() { + super.onResume(); + binding.mapView.resume(); + } + + @Override + protected void onPause() { + super.onPause(); + binding.mapView.pause(); + } + + private void addMarker(Point point) { + SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.RED, 10); + Graphic graphic = new Graphic(point, simpleMarkerSymbol); + GraphicsOverlay mGraphicsOverlay = new GraphicsOverlay(); + ListenableList overlayGraphics = mGraphicsOverlay.getGraphics(); + ListenableList graphicsOverlays = binding.mapView.getGraphicsOverlays(); + overlayGraphics.add(graphic); + graphicsOverlays.add(mGraphicsOverlay); + } +} diff --git a/app/src/main/java/com/casic/dcms/view/pipeline/PipelineManagerActivity.java b/app/src/main/java/com/casic/dcms/view/pipeline/PipelineManagerActivity.java index e2e6656..eac37ed 100644 --- a/app/src/main/java/com/casic/dcms/view/pipeline/PipelineManagerActivity.java +++ b/app/src/main/java/com/casic/dcms/view/pipeline/PipelineManagerActivity.java @@ -1,6 +1,7 @@ package com.casic.dcms.view.pipeline; import android.content.Context; +import android.content.Intent; import android.graphics.Color; import android.os.Bundle; import android.os.Handler; @@ -75,7 +76,13 @@ showBatchCancelDialog(); break; case 1: - ContextKit.navigatePageTo(context, WarningOnMapActivity.class); + if (dataBeans.isEmpty()) { + StringKit.show(context, "无报警数据"); + return; + } + Intent intent = new Intent(context, AlarmOnMapActivity.class); + intent.putParcelableArrayListExtra("rows_list", new ArrayList<>(dataBeans)); + context.startActivity(intent); break; case 2: ContextKit.navigatePageTo(context, WellListActivity.class); @@ -153,7 +160,7 @@ } private void getAlarmList() { - alarmViewModel.getAlarmList(this, LocaleConstant.PAGE_LIMIT, page); + alarmViewModel.getAlarmList(this, page); } @Override diff --git a/.gitignore b/.gitignore index f0f71e2..ee6b213 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,12 @@ *.iml .gradle /local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml +/.idea .DS_Store /build /captures .externalNativeBuild .cxx .idea +*.apk +*.json diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fdb7255..6873489 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -109,7 +109,7 @@ - + diff --git a/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java b/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java index 2dcdc64..0364fc7 100644 --- a/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java +++ b/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java @@ -9,6 +9,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; @@ -25,7 +26,6 @@ private final Context context; private final List dataRows; private final LayoutInflater layoutInflater; - private PunishTypeAdapter adapter; public PackageCaseListAdapter(Context context, List dataRows) { this.context = context; @@ -36,7 +36,7 @@ @NonNull @Override public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new ItemViewHolder(layoutInflater.inflate(R.layout.item_package_rv, parent, false)); + return new ItemViewHolder(layoutInflater.inflate(R.layout.item_package_rv_l, parent, false)); } @Override @@ -57,16 +57,67 @@ return dataRows.size(); } - @SuppressLint("NotifyDataSetChanged") - public void refresh(List dataRows) { - this.dataRows.clear(); - this.dataRows.addAll(dataRows); - notifyDataSetChanged(); + public void refresh(List newRows) { + DiffUtil.Callback diffCallback = new DiffUtil.Callback() { + + @Override + public int getOldListSize() { + return dataRows.size(); + } + + @Override + public int getNewListSize() { + return newRows.size(); + } + + @Override + public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { + if (dataRows == null || newRows == null) { + return false; + } + + // 检查索引是否在有效范围内 + if (oldItemPosition < 0 || oldItemPosition >= dataRows.size() || + newItemPosition < 0 || newItemPosition >= newRows.size()) { + return false; + } + + // 获取元素并进行比较 + Object oldItem = dataRows.get(oldItemPosition); + Object newItem = newRows.get(newItemPosition); + + // 处理空指针情况 + if (oldItem == null && newItem == null) { + return true; + } + if (oldItem == null || newItem == null) { + return false; + } + + return oldItem.equals(newItem); + } + + @Override + public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { + return dataRows.get(oldItemPosition) == newRows.get(newItemPosition); + } + }; + + DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallback); + + dataRows.clear(); + dataRows.addAll(newRows); + + diffResult.dispatchUpdatesTo(this); } - public void loadMore(List dataRows) { - this.dataRows.addAll(dataRows); - notifyItemRangeInserted(this.dataRows.size(), dataRows.size()); + public void loadMore(List newRows) { + if (newRows.isEmpty()) { + return; + } + int startPosition = this.dataRows.size(); + this.dataRows.addAll(newRows); + notifyItemRangeInserted(startPosition, newRows.size()); } class ItemViewHolder extends RecyclerView.ViewHolder { @@ -84,7 +135,6 @@ casePunishView = itemView.findViewById(R.id.casePunishView); } - void bindView(PackageCaseBean.DataBean.RowsBean rowsBean) { //三包核实图片 String fileIdVerify = rowsBean.getFileIdVerify(); @@ -97,45 +147,6 @@ } caseTitleView.setText(rowsBean.getDescription()); caseDateView.setText("上报时间:" + rowsBean.getReportTime()); -// HttpRequestHelper.doRequest(LocaleConstant.SHOP_PUNISH_LIST, rowsBean.getShopId(), new IHttpRequestListener() { -// @Override -// public void onSuccess(ResponseBody resultBean) { -// try { -// PunishTypeBean punishTypeBean = gson.fromJson(resultBean.string(), PunishTypeBean.class); -// if (punishTypeBean.getData().size() != 0) { -// //获取商铺处罚次数 -// HttpRequestHelper.doRequest(LocaleConstant.SHOP_PUNISH_TYPE, rowsBean.getShopId(), new IHttpRequestListener() { -// @Override -// public void onSuccess(ResponseBody resultBean) { -// try { -// PunishTimesBean punishTimesBean = gson.fromJson(resultBean.string(), PunishTimesBean.class); -// -// adapter = new PunishTypeAdapter(context, punishTypeBean.getData(), punishTimesBean.getData()); -// LinearLayoutManager layoutManager = new LinearLayoutManager(context); -// layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); -// punishRecyclerView.setLayoutManager(layoutManager); -// punishRecyclerView.setAdapter(adapter); -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } -// -// @Override -// public void onFailure(Throwable throwable) { -// -// } -// }); -// } -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } -// -// @Override -// public void onFailure(Throwable throwable) { -// -// } -// }); } } diff --git a/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java b/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java deleted file mode 100644 index 2e178e5..0000000 --- a/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.casic.dcms.adapter; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.core.content.ContextCompat; -import androidx.recyclerview.widget.RecyclerView; - -import com.casic.dcms.R; -import com.casic.dcms.model.PunishTimesBean; -import com.casic.dcms.model.PunishTypeBean; - -import java.util.List; - -@SuppressLint("SetTextI18n") -public class PunishTypeAdapter extends RecyclerView.Adapter { - - private final Context context; - private final List dataRows; - private final PunishTimesBean.DataBean dataBean; - private final LayoutInflater layoutInflater; - - PunishTypeAdapter(Context context, List dataRows, PunishTimesBean.DataBean dataBean) { - this.context = context; - this.dataRows = dataRows; - this.dataBean = dataBean; - this.layoutInflater = LayoutInflater.from(context); - } - - @NonNull - @Override - public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new ItemViewHolder(layoutInflater.inflate(R.layout.item_punish_recycleview, parent, false)); - } - - @Override - public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { - String typeName = dataRows.get(position).getPunishTypeName(); - int color, times; - switch (typeName) { - case "劝导": - times = dataBean.getPersuade(); - color = ContextCompat.getColor(context, R.color.persuadeColor); - break; - case "警告": - times = dataBean.getWarn(); - color = ContextCompat.getColor(context, R.color.warnColor); - break; - case "处罚": - times = dataBean.getPunish(); - color = ContextCompat.getColor(context, R.color.punishColor); - break; - default: - times = 0; - color = ContextCompat.getColor(context, R.color.mainThemeColor); - break; - } - if (times == 0) { - holder.punishTypeView.setVisibility(View.GONE); - } else { - holder.punishTypeView.setText(typeName + " x " + times); - holder.punishTypeView.setBackgroundColor(color); - } - } - - @Override - public int getItemCount() { - return dataRows.size(); - } - - static class ItemViewHolder extends RecyclerView.ViewHolder { - - private final TextView punishTypeView; - - ItemViewHolder(@NonNull View itemView) { - super(itemView); - punishTypeView = itemView.findViewById(R.id.punishTypeView); - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java b/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java deleted file mode 100644 index dc57ca3..0000000 --- a/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.dcms.model; - -public class PunishTimesBean { - 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 { - /** - * warn : 0 - * punish : 0 - * persuade : 0 - */ - - private int warn; - private int punish; - private int persuade; - - public int getWarn() { - return warn; - } - - public void setWarn(int warn) { - this.warn = warn; - } - - public int getPunish() { - return punish; - } - - public void setPunish(int punish) { - this.punish = punish; - } - - public int getPersuade() { - return persuade; - } - - public void setPersuade(int persuade) { - this.persuade = persuade; - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java b/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java deleted file mode 100644 index 00b6a98..0000000 --- a/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.casic.dcms.model; - -import java.util.List; - -public class PunishTypeBean { - private int code; - private String message; - private boolean success; - private List data; - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - 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 List getData() { - return data; - } - - public void setData(List data) { - this.data = data; - } - - public static class DataBean { - /** - * punishTime : 2021-01-12 09:08:59 - * punishTypeName : 处罚 - * punishImage : images - * punishType : 1 - * punishRemarks : 处罚 - */ - - private String punishTime; - private String punishTypeName; - private String punishImage; - private String punishType; - private String punishRemarks; - - public String getPunishTime() { - return punishTime; - } - - public void setPunishTime(String punishTime) { - this.punishTime = punishTime; - } - - public String getPunishTypeName() { - return punishTypeName; - } - - public void setPunishTypeName(String punishTypeName) { - this.punishTypeName = punishTypeName; - } - - public String getPunishImage() { - return punishImage; - } - - public void setPunishImage(String punishImage) { - this.punishImage = punishImage; - } - - public String getPunishType() { - return punishType; - } - - public void setPunishType(String punishType) { - this.punishType = punishType; - } - - public String getPunishRemarks() { - return punishRemarks; - } - - public void setPunishRemarks(String punishRemarks) { - this.punishRemarks = punishRemarks; - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/UnitFeatureBean.java b/app/src/main/java/com/casic/dcms/model/UnitFeatureBean.java deleted file mode 100644 index a4d8337..0000000 --- a/app/src/main/java/com/casic/dcms/model/UnitFeatureBean.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.casic.dcms.model; - -public class UnitFeatureBean { - - private String BGID; - private String BGNAME; - private int OBJECTID; - - public String getBGID() { - return BGID; - } - - public void setBGID(String BGID) { - this.BGID = BGID; - } - - public String getBGNAME() { - return BGNAME; - } - - public void setBGNAME(String BGNAME) { - this.BGNAME = BGNAME; - } - - public int getOBJECTID() { - return OBJECTID; - } - - public void setOBJECTID(int OBJECTID) { - this.OBJECTID = OBJECTID; - } -} diff --git a/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java b/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java index 0578f7b..b0c24d5 100644 --- a/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java +++ b/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java @@ -1,9 +1,16 @@ package com.casic.dcms.model; +import android.os.Parcel; +import android.os.Parcelable; + +import androidx.annotation.NonNull; + import java.util.List; -public class WellAlarmListBean { - +/** + * Parcelable 是 Android 平台专门为性能优化而设计的序列化机制,通常比 Serializable 快 10 倍左右 + */ +public class WellAlarmListBean implements Parcelable { private int code; private DataBean data; private String message; @@ -41,7 +48,43 @@ this.success = success; } - public static class DataBean { + public WellAlarmListBean() { + + } + + protected WellAlarmListBean(Parcel in) { + code = in.readInt(); + data = in.readParcelable(DataBean.class.getClassLoader()); + message = in.readString(); + success = in.readByte() != 0; + } + + public static final Creator CREATOR = new Creator() { + @Override + public WellAlarmListBean createFromParcel(Parcel in) { + return new WellAlarmListBean(in); + } + + @Override + public WellAlarmListBean[] newArray(int size) { + return new WellAlarmListBean[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + dest.writeInt(code); + dest.writeParcelable(data, flags); + dest.writeString(message); + dest.writeByte((byte) (success ? 1 : 0)); + } + + public static class DataBean implements Parcelable { private int total; private List rows; @@ -62,7 +105,38 @@ this.rows = rows; } - public static class RowsBean { + public DataBean() { + } + + protected DataBean(Parcel in) { + total = in.readInt(); + rows = in.createTypedArrayList(RowsBean.CREATOR); + } + + public static final Creator CREATOR = new Creator() { + @Override + public DataBean createFromParcel(Parcel in) { + return new DataBean(in); + } + + @Override + public DataBean[] newArray(int size) { + return new DataBean[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(total); + dest.writeTypedList(rows); + } + + public static class RowsBean implements Parcelable { /** * alarmContent : 1 * deptName : 崇仁县城管局 @@ -296,6 +370,79 @@ public void setStatus(String status) { this.status = status; } + + public RowsBean() { + } + + protected RowsBean(Parcel in) { + alarmContent = in.readInt(); + deptName = in.readString(); + jobStatus = in.readString(); + alarmContentName = in.readString(); + wellCode = in.readString(); + alarmTime = in.readString(); + deptid = in.readString(); + alarmTypeName = in.readString(); + alarmMessage = in.readString(); + staff = in.readString(); + deviceId = in.readString(); + jobId = in.readString(); + jobStatusName = in.readString(); + alarmType = in.readString(); + alarmValue = in.readString(); + devcode = in.readString(); + statusName = in.readString(); + alarmLevel = in.readString(); + tel = in.readString(); + id = in.readString(); + wellId = in.readString(); + position = in.readString(); + status = in.readString(); + } + + public static final Creator CREATOR = new Creator() { + @Override + public RowsBean createFromParcel(Parcel in) { + return new RowsBean(in); + } + + @Override + public RowsBean[] newArray(int size) { + return new RowsBean[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(alarmContent); + dest.writeString(deptName); + dest.writeString(jobStatus); + dest.writeString(alarmContentName); + dest.writeString(wellCode); + dest.writeString(alarmTime); + dest.writeString(deptid); + dest.writeString(alarmTypeName); + dest.writeString(alarmMessage); + dest.writeString(staff); + dest.writeString(deviceId); + dest.writeString(jobId); + dest.writeString(jobStatusName); + dest.writeString(alarmType); + dest.writeString(alarmValue); + dest.writeString(devcode); + dest.writeString(statusName); + dest.writeString(alarmLevel); + dest.writeString(tel); + dest.writeString(id); + dest.writeString(wellId); + dest.writeString(position); + dest.writeString(status); + } } } } diff --git a/app/src/main/java/com/casic/dcms/model/WellDetailBean.java b/app/src/main/java/com/casic/dcms/model/WellDetailBean.java index cea8774..4e6c8fd 100644 --- a/app/src/main/java/com/casic/dcms/model/WellDetailBean.java +++ b/app/src/main/java/com/casic/dcms/model/WellDetailBean.java @@ -60,7 +60,6 @@ } public static class FieldAliasesBean { - private String objectid; private String 编号; private String 附属物编码; @@ -190,7 +189,6 @@ } public static class SpatialReferenceBean { - private int wkid; private int latestWkid; @@ -212,7 +210,6 @@ } public static class FieldsBean { - private String name; private String type; private String alias; @@ -252,7 +249,6 @@ } public static class FeaturesBean { - private AttributesBean attributes; private GeometryBean geometry; diff --git a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java index 8b15d77..6f1d941 100644 --- a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java @@ -621,8 +621,8 @@ /** * 报警列表 */ - public static Observable getAlarmList(int limit, int offset) { - return api.getAlarmList(AuthenticationHelper.getToken(), "1", limit, offset); + public static Observable getAlarmList(int offset) { + return api.getAlarmList(AuthenticationHelper.getToken(), "1", LocaleConstant.PAGE_LIMIT, offset); } /** @@ -662,18 +662,15 @@ return api.optionWellStatus(AuthenticationHelper.getToken(), bfzt); } + private static final RetrofitService arcgisApi = RetrofitFactory.createRetrofit( + "http://111.198.10.15:13002", RetrofitService.class, true + ); + /** * 报警窨井详情 */ public static Observable getWellDetailResult(String where) { -// Retrofit retrofit = new Retrofit.Builder() -// .baseUrl("http://111.198.10.15:13002") -// .addConverterFactory(GsonConverterFactory.create())//Gson转换器 -// .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) -// .client(createOKHttpClient())//log拦截器 -// .build(); -// RetrofitService service = retrofit.create(RetrofitService.class); - return api.getWellDetail( + return arcgisApi.getWellDetail( "json", "4326", "4326", "*", true, where ); } diff --git a/app/src/main/java/com/casic/dcms/view/pipeline/AlarmOnMapActivity.java b/app/src/main/java/com/casic/dcms/view/pipeline/AlarmOnMapActivity.java new file mode 100644 index 0000000..e3dc01d --- /dev/null +++ b/app/src/main/java/com/casic/dcms/view/pipeline/AlarmOnMapActivity.java @@ -0,0 +1,212 @@ +package com.casic.dcms.view.pipeline; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.DialogInterface; +import android.graphics.Color; +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; + +import com.casic.dcms.R; +import com.casic.dcms.databinding.ActivityMapAlarmBinding; +import com.casic.dcms.model.WellAlarmListBean; +import com.casic.dcms.model.WellDetailBean; +import com.casic.dcms.utils.ArcGisMapCreator; +import com.casic.dcms.utils.LocaleConstant; +import com.casic.dcms.utils.ViewGroupKit; +import com.casic.dcms.vm.WellViewModel; +import com.esri.arcgisruntime.geometry.Point; +import com.esri.arcgisruntime.mapping.ArcGISMap; +import com.esri.arcgisruntime.mapping.Basemap; +import com.esri.arcgisruntime.mapping.BasemapStyle; +import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; +import com.esri.arcgisruntime.mapping.view.Graphic; +import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; +import com.esri.arcgisruntime.symbology.SimpleMarkerSymbol; +import com.esri.arcgisruntime.util.ListenableList; +import com.pengxh.androidx.lite.base.AndroidxBaseActivity; +import com.pengxh.androidx.lite.utils.LoadState; +import com.pengxh.androidx.lite.utils.LoadingDialog; +import com.pengxh.androidx.lite.widget.TitleBarView; +import com.qmuiteam.qmui.util.QMUIDisplayHelper; +import com.qmuiteam.qmui.widget.dialog.QMUIDialog; +import com.qmuiteam.qmui.widget.popup.QMUIPopup; +import com.qmuiteam.qmui.widget.popup.QMUIPopups; + +import java.util.ArrayList; +import java.util.List; + +public class AlarmOnMapActivity extends AndroidxBaseActivity { + + private static final String TAG = "AlarmOnMapActivity"; + private final Context context = this; + private final List geometryList = new ArrayList<>(); + private WellViewModel wellViewModel; + + @Override + protected void setupTopBarLayout() { + ViewGroupKit.initImmersionBar(binding.rootView, this, true, R.color.white); + binding.titleView.setOnClickListener(new TitleBarView.OnClickListener() { + @Override + public void onLeftClick() { + finish(); + } + + @Override + public void onRightClick() { + + } + }); + } + + @Override + protected void observeRequestState() { + wellViewModel.loadState.observe(this, new Observer() { + @Override + public void onChanged(LoadState loadState) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(AlarmOnMapActivity.this, "数据加载中,请稍后"); + } else { + LoadingDialog.dismiss(); + } + } + }); + } + + @Override + public void initOnCreate(@Nullable Bundle savedInstanceState) { + binding.mapView.setAttributionTextVisible(false);//去掉左下角属性标识 + binding.mapView.setViewpointScaleAsync(64000); + ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_STREETS); + //创建底图、并设置底图图层 + Basemap basemap = new Basemap(ArcGisMapCreator.createNoGridLayer()); + arcGISMap.setBasemap(basemap); + binding.mapView.setMap(arcGISMap); + + wellViewModel = new ViewModelProvider(this).get(WellViewModel.class); + wellViewModel.resultModel.observe(this, new Observer() { + @Override + public void onChanged(WellDetailBean wellDetailBean) { + List features = wellDetailBean.getFeatures(); + if (features.size() > 0) { + WellDetailBean.FeaturesBean featuresBean = features.get(0); + //将获取到的井数据缓存起来 + geometryList.add(featuresBean); + WellDetailBean.FeaturesBean.GeometryBean geometryBean = featuresBean.getGeometry(); + //每获取一个点就绘制出 + addMarker(new Point(geometryBean.getX(), geometryBean.getY())); + } + } + }); + + Bundle extras = getIntent().getExtras(); + if (extras != null) { + List dataBeans = extras.getParcelableArrayList("rows_list"); + if (dataBeans == null) { + return; + } + for (WellAlarmListBean.DataBean.RowsBean dataBean : dataBeans) { + String queryParam = "编号='" + dataBean.getWellCode() + "'"; + Log.d(TAG, "queryParam: " + queryParam); + wellViewModel.getWellDetail(context, queryParam); + } + } + } + + @SuppressLint("ClickableViewAccessibility") + @Override + public void initEvent() { + binding.expandMapView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 0.5); + } + }); + binding.minusMapView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 2); + } + }); + + binding.mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, binding.mapView) { + @Override + public boolean onSingleTapConfirmed(MotionEvent e) { + android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); + Point clickPoint = binding.mapView.screenToLocation(screenPoint); + if (geometryList.size() > 0) { + List tempList = new ArrayList<>(); + for (WellDetailBean.FeaturesBean featuresBean : geometryList) { + WellDetailBean.FeaturesBean.GeometryBean dataBean = featuresBean.getGeometry(); + if (Math.abs(dataBean.getX() - clickPoint.getX()) <= 10 * LocaleConstant.DELTA_LNG_10 && + Math.abs(dataBean.getY() - clickPoint.getY()) <= 10 * LocaleConstant.DELTA_LNG_10) { + tempList.add(featuresBean); + } + } + if (tempList.size() > 0) { + QMUIDialog.MenuDialogBuilder menuDialogBuilder = new QMUIDialog.MenuDialogBuilder(context); + menuDialogBuilder.setTitle("请选择您要查看的窨井"); + for (WellDetailBean.FeaturesBean dataBean : tempList) { + menuDialogBuilder.addItem(dataBean.getAttributes().get编号(), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + + View popupView = LayoutInflater.from(context).inflate(R.layout.popu_well, null); + TextView wellCodeView = popupView.findViewById(R.id.wellCodeView); + TextView wellTypeView = popupView.findViewById(R.id.wellTypeView); + TextView wellPositionView = popupView.findViewById(R.id.wellPositionView); + + WellDetailBean.FeaturesBean.AttributesBean attributes = dataBean.getAttributes(); + wellCodeView.setText(attributes.get编号()); + wellTypeView.setText(attributes.get附属物名称()); + wellPositionView.setText(attributes.get所属道路()); + + QMUIPopups.popup(context, QMUIDisplayHelper.dp2px(context, 290)) + .preferredDirection(QMUIPopup.DIRECTION_BOTTOM) + .view(popupView) + .edgeProtection(QMUIDisplayHelper.dp2px(context, 20)) + .dimAmount(0.6f) + .animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER) + .onDismiss(null) + .show(binding.mapView); + } + }); + } + menuDialogBuilder.create().show(); + } + } + return super.onSingleTapConfirmed(e); + } + }); + } + + protected void onResume() { + super.onResume(); + binding.mapView.resume(); + } + + @Override + protected void onPause() { + super.onPause(); + binding.mapView.pause(); + } + + private void addMarker(Point point) { + SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.RED, 10); + Graphic graphic = new Graphic(point, simpleMarkerSymbol); + GraphicsOverlay mGraphicsOverlay = new GraphicsOverlay(); + ListenableList overlayGraphics = mGraphicsOverlay.getGraphics(); + ListenableList graphicsOverlays = binding.mapView.getGraphicsOverlays(); + overlayGraphics.add(graphic); + graphicsOverlays.add(mGraphicsOverlay); + } +} diff --git a/app/src/main/java/com/casic/dcms/view/pipeline/PipelineManagerActivity.java b/app/src/main/java/com/casic/dcms/view/pipeline/PipelineManagerActivity.java index e2e6656..eac37ed 100644 --- a/app/src/main/java/com/casic/dcms/view/pipeline/PipelineManagerActivity.java +++ b/app/src/main/java/com/casic/dcms/view/pipeline/PipelineManagerActivity.java @@ -1,6 +1,7 @@ package com.casic.dcms.view.pipeline; import android.content.Context; +import android.content.Intent; import android.graphics.Color; import android.os.Bundle; import android.os.Handler; @@ -75,7 +76,13 @@ showBatchCancelDialog(); break; case 1: - ContextKit.navigatePageTo(context, WarningOnMapActivity.class); + if (dataBeans.isEmpty()) { + StringKit.show(context, "无报警数据"); + return; + } + Intent intent = new Intent(context, AlarmOnMapActivity.class); + intent.putParcelableArrayListExtra("rows_list", new ArrayList<>(dataBeans)); + context.startActivity(intent); break; case 2: ContextKit.navigatePageTo(context, WellListActivity.class); @@ -153,7 +160,7 @@ } private void getAlarmList() { - alarmViewModel.getAlarmList(this, LocaleConstant.PAGE_LIMIT, page); + alarmViewModel.getAlarmList(this, page); } @Override diff --git a/app/src/main/java/com/casic/dcms/view/pipeline/WarningOnMapActivity.java b/app/src/main/java/com/casic/dcms/view/pipeline/WarningOnMapActivity.java deleted file mode 100644 index 66a38d0..0000000 --- a/app/src/main/java/com/casic/dcms/view/pipeline/WarningOnMapActivity.java +++ /dev/null @@ -1,230 +0,0 @@ -package com.casic.dcms.view.pipeline; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.content.DialogInterface; -import android.graphics.Color; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.widget.TextView; - -import androidx.annotation.Nullable; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProvider; - -import com.casic.dcms.R; -import com.casic.dcms.databinding.ActivityMapWarningBinding; -import com.casic.dcms.model.WellAlarmListBean; -import com.casic.dcms.model.WellDetailBean; -import com.casic.dcms.utils.ArcGisMapCreator; -import com.casic.dcms.utils.LocaleConstant; -import com.casic.dcms.utils.ViewGroupKit; -import com.casic.dcms.vm.AlarmViewModel; -import com.casic.dcms.vm.WellViewModel; -import com.esri.arcgisruntime.geometry.Point; -import com.esri.arcgisruntime.mapping.ArcGISMap; -import com.esri.arcgisruntime.mapping.Basemap; -import com.esri.arcgisruntime.mapping.BasemapStyle; -import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; -import com.esri.arcgisruntime.mapping.view.Graphic; -import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; -import com.esri.arcgisruntime.symbology.SimpleMarkerSymbol; -import com.esri.arcgisruntime.util.ListenableList; -import com.pengxh.androidx.lite.base.AndroidxBaseActivity; -import com.pengxh.androidx.lite.utils.LoadState; -import com.pengxh.androidx.lite.utils.LoadingDialog; -import com.pengxh.androidx.lite.utils.SaveKeyValues; -import com.pengxh.androidx.lite.widget.TitleBarView; -import com.qmuiteam.qmui.util.QMUIDisplayHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; -import com.qmuiteam.qmui.widget.popup.QMUIPopup; -import com.qmuiteam.qmui.widget.popup.QMUIPopups; - -import java.util.ArrayList; -import java.util.List; - -public class WarningOnMapActivity extends AndroidxBaseActivity { - - private static final String TAG = "WarningOnMapActivity"; - private final Context context = this; - private final List geometryList = new ArrayList<>(); - private AlarmViewModel alarmViewModel; - private WellViewModel wellViewModel; - - @Override - protected void setupTopBarLayout() { - ViewGroupKit.initImmersionBar(binding.rootView, this, true, R.color.white); - binding.titleView.setOnClickListener(new TitleBarView.OnClickListener() { - @Override - public void onLeftClick() { - finish(); - } - - @Override - public void onRightClick() { - - } - }); - } - - @Override - protected void observeRequestState() { - alarmViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - if (loadState == LoadState.Loading) { - LoadingDialog.show(WarningOnMapActivity.this, "数据加载中,请稍后"); - } else { - LoadingDialog.dismiss(); - } - } - }); - - wellViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - - } - }); - } - - @Override - public void initOnCreate(@Nullable Bundle savedInstanceState) { - binding.mapView.setAttributionTextVisible(false);//去掉左下角属性标识 - binding.mapView.setViewpointScaleAsync(64000); - ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_STREETS); - //创建底图、并设置底图图层 - Basemap basemap = new Basemap(ArcGisMapCreator.createNoGridLayer()); - arcGISMap.setBasemap(basemap); - binding.mapView.setMap(arcGISMap); - - int alarmTotal = (int) SaveKeyValues.getValue("alarmTotal", LocaleConstant.PAGE_LIMIT); - alarmViewModel = new ViewModelProvider(this).get(AlarmViewModel.class); - alarmViewModel.wellAlarmListResult.observe(this, new Observer() { - @Override - public void onChanged(WellAlarmListBean alarmDataBean) { - if (alarmDataBean.getCode() == 200) { - List dataRows = alarmDataBean.getData().getRows(); - for (WellAlarmListBean.DataBean.RowsBean rowsBean : dataRows) { - String queryParam = "编号='" + rowsBean.getWellCode() + "'"; - wellViewModel.getWellDetail(context, queryParam); - } - } - } - }); - alarmViewModel.getAlarmList(this, alarmTotal, 1); - - wellViewModel = new ViewModelProvider(this).get(WellViewModel.class); - wellViewModel.resultModel.observe(this, new Observer() { - @Override - public void onChanged(WellDetailBean wellDetailBean) { - List features = wellDetailBean.getFeatures(); - if (features.size() > 0) { - WellDetailBean.FeaturesBean featuresBean = features.get(0); - //将获取到的井数据缓存起来 - geometryList.add(featuresBean); - WellDetailBean.FeaturesBean.GeometryBean geometryBean = featuresBean.getGeometry(); - //每获取一个点就绘制出 - addMarker(new Point(geometryBean.getX(), geometryBean.getY())); - } - } - }); - } - - @SuppressLint("ClickableViewAccessibility") - @Override - public void initEvent() { - binding.expandMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 0.5); - } - }); - binding.minusMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 2); - } - }); - - binding.mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, binding.mapView) { - @Override - public boolean onSingleTapConfirmed(MotionEvent e) { - android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); - Point clickPoint = binding.mapView.screenToLocation(screenPoint); - if (geometryList.size() > 0) { - List tempList = new ArrayList<>(); - for (WellDetailBean.FeaturesBean featuresBean : geometryList) { - WellDetailBean.FeaturesBean.GeometryBean dataBean = featuresBean.getGeometry(); - if (Math.abs(dataBean.getX() - clickPoint.getX()) <= 10 * LocaleConstant.DELTA_LNG_10 && - Math.abs(dataBean.getY() - clickPoint.getY()) <= 10 * LocaleConstant.DELTA_LNG_10) { - tempList.add(featuresBean); - } - } - if (tempList.size() > 0) { - QMUIDialog.MenuDialogBuilder menuDialogBuilder = new QMUIDialog.MenuDialogBuilder(context); - menuDialogBuilder.setTitle("请选择您要查看的窨井"); - for (WellDetailBean.FeaturesBean dataBean : tempList) { - menuDialogBuilder.addItem(dataBean.getAttributes().get编号(), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - - View popupView = LayoutInflater.from(context).inflate(R.layout.popu_well, null); - TextView wellCodeView = popupView.findViewById(R.id.wellCodeView); - TextView wellTypeView = popupView.findViewById(R.id.wellTypeView); - TextView wellPositionView = popupView.findViewById(R.id.wellPositionView); - - WellDetailBean.FeaturesBean.AttributesBean attributes = dataBean.getAttributes(); - wellCodeView.setText(attributes.get编号()); - wellTypeView.setText(attributes.get附属物名称()); - wellPositionView.setText(attributes.get所属道路()); - - QMUIPopups.popup(context, QMUIDisplayHelper.dp2px(context, 290)) - .preferredDirection(QMUIPopup.DIRECTION_BOTTOM) - .view(popupView) - .edgeProtection(QMUIDisplayHelper.dp2px(context, 20)) - .dimAmount(0.6f) - .animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER) - .onDismiss(null) - .show(binding.mapView); - } - }); - } - menuDialogBuilder.create().show(); - } - } - return super.onSingleTapConfirmed(e); - } - }); - } - - protected void onResume() { - super.onResume(); - binding.mapView.resume(); - } - - @Override - protected void onPause() { - super.onPause(); - binding.mapView.pause(); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - binding.mapView.dispose(); - } - - private void addMarker(Point point) { - SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.RED, 10); - Graphic graphic = new Graphic(point, simpleMarkerSymbol); - GraphicsOverlay mGraphicsOverlay = new GraphicsOverlay(); - ListenableList overlayGraphics = mGraphicsOverlay.getGraphics(); - ListenableList graphicsOverlays = binding.mapView.getGraphicsOverlays(); - overlayGraphics.add(graphic); - graphicsOverlays.add(mGraphicsOverlay); - } -} diff --git a/.gitignore b/.gitignore index f0f71e2..ee6b213 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,12 @@ *.iml .gradle /local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml +/.idea .DS_Store /build /captures .externalNativeBuild .cxx .idea +*.apk +*.json diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fdb7255..6873489 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -109,7 +109,7 @@ - + diff --git a/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java b/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java index 2dcdc64..0364fc7 100644 --- a/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java +++ b/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java @@ -9,6 +9,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; @@ -25,7 +26,6 @@ private final Context context; private final List dataRows; private final LayoutInflater layoutInflater; - private PunishTypeAdapter adapter; public PackageCaseListAdapter(Context context, List dataRows) { this.context = context; @@ -36,7 +36,7 @@ @NonNull @Override public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new ItemViewHolder(layoutInflater.inflate(R.layout.item_package_rv, parent, false)); + return new ItemViewHolder(layoutInflater.inflate(R.layout.item_package_rv_l, parent, false)); } @Override @@ -57,16 +57,67 @@ return dataRows.size(); } - @SuppressLint("NotifyDataSetChanged") - public void refresh(List dataRows) { - this.dataRows.clear(); - this.dataRows.addAll(dataRows); - notifyDataSetChanged(); + public void refresh(List newRows) { + DiffUtil.Callback diffCallback = new DiffUtil.Callback() { + + @Override + public int getOldListSize() { + return dataRows.size(); + } + + @Override + public int getNewListSize() { + return newRows.size(); + } + + @Override + public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { + if (dataRows == null || newRows == null) { + return false; + } + + // 检查索引是否在有效范围内 + if (oldItemPosition < 0 || oldItemPosition >= dataRows.size() || + newItemPosition < 0 || newItemPosition >= newRows.size()) { + return false; + } + + // 获取元素并进行比较 + Object oldItem = dataRows.get(oldItemPosition); + Object newItem = newRows.get(newItemPosition); + + // 处理空指针情况 + if (oldItem == null && newItem == null) { + return true; + } + if (oldItem == null || newItem == null) { + return false; + } + + return oldItem.equals(newItem); + } + + @Override + public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { + return dataRows.get(oldItemPosition) == newRows.get(newItemPosition); + } + }; + + DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallback); + + dataRows.clear(); + dataRows.addAll(newRows); + + diffResult.dispatchUpdatesTo(this); } - public void loadMore(List dataRows) { - this.dataRows.addAll(dataRows); - notifyItemRangeInserted(this.dataRows.size(), dataRows.size()); + public void loadMore(List newRows) { + if (newRows.isEmpty()) { + return; + } + int startPosition = this.dataRows.size(); + this.dataRows.addAll(newRows); + notifyItemRangeInserted(startPosition, newRows.size()); } class ItemViewHolder extends RecyclerView.ViewHolder { @@ -84,7 +135,6 @@ casePunishView = itemView.findViewById(R.id.casePunishView); } - void bindView(PackageCaseBean.DataBean.RowsBean rowsBean) { //三包核实图片 String fileIdVerify = rowsBean.getFileIdVerify(); @@ -97,45 +147,6 @@ } caseTitleView.setText(rowsBean.getDescription()); caseDateView.setText("上报时间:" + rowsBean.getReportTime()); -// HttpRequestHelper.doRequest(LocaleConstant.SHOP_PUNISH_LIST, rowsBean.getShopId(), new IHttpRequestListener() { -// @Override -// public void onSuccess(ResponseBody resultBean) { -// try { -// PunishTypeBean punishTypeBean = gson.fromJson(resultBean.string(), PunishTypeBean.class); -// if (punishTypeBean.getData().size() != 0) { -// //获取商铺处罚次数 -// HttpRequestHelper.doRequest(LocaleConstant.SHOP_PUNISH_TYPE, rowsBean.getShopId(), new IHttpRequestListener() { -// @Override -// public void onSuccess(ResponseBody resultBean) { -// try { -// PunishTimesBean punishTimesBean = gson.fromJson(resultBean.string(), PunishTimesBean.class); -// -// adapter = new PunishTypeAdapter(context, punishTypeBean.getData(), punishTimesBean.getData()); -// LinearLayoutManager layoutManager = new LinearLayoutManager(context); -// layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); -// punishRecyclerView.setLayoutManager(layoutManager); -// punishRecyclerView.setAdapter(adapter); -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } -// -// @Override -// public void onFailure(Throwable throwable) { -// -// } -// }); -// } -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } -// -// @Override -// public void onFailure(Throwable throwable) { -// -// } -// }); } } diff --git a/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java b/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java deleted file mode 100644 index 2e178e5..0000000 --- a/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.casic.dcms.adapter; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.core.content.ContextCompat; -import androidx.recyclerview.widget.RecyclerView; - -import com.casic.dcms.R; -import com.casic.dcms.model.PunishTimesBean; -import com.casic.dcms.model.PunishTypeBean; - -import java.util.List; - -@SuppressLint("SetTextI18n") -public class PunishTypeAdapter extends RecyclerView.Adapter { - - private final Context context; - private final List dataRows; - private final PunishTimesBean.DataBean dataBean; - private final LayoutInflater layoutInflater; - - PunishTypeAdapter(Context context, List dataRows, PunishTimesBean.DataBean dataBean) { - this.context = context; - this.dataRows = dataRows; - this.dataBean = dataBean; - this.layoutInflater = LayoutInflater.from(context); - } - - @NonNull - @Override - public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new ItemViewHolder(layoutInflater.inflate(R.layout.item_punish_recycleview, parent, false)); - } - - @Override - public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { - String typeName = dataRows.get(position).getPunishTypeName(); - int color, times; - switch (typeName) { - case "劝导": - times = dataBean.getPersuade(); - color = ContextCompat.getColor(context, R.color.persuadeColor); - break; - case "警告": - times = dataBean.getWarn(); - color = ContextCompat.getColor(context, R.color.warnColor); - break; - case "处罚": - times = dataBean.getPunish(); - color = ContextCompat.getColor(context, R.color.punishColor); - break; - default: - times = 0; - color = ContextCompat.getColor(context, R.color.mainThemeColor); - break; - } - if (times == 0) { - holder.punishTypeView.setVisibility(View.GONE); - } else { - holder.punishTypeView.setText(typeName + " x " + times); - holder.punishTypeView.setBackgroundColor(color); - } - } - - @Override - public int getItemCount() { - return dataRows.size(); - } - - static class ItemViewHolder extends RecyclerView.ViewHolder { - - private final TextView punishTypeView; - - ItemViewHolder(@NonNull View itemView) { - super(itemView); - punishTypeView = itemView.findViewById(R.id.punishTypeView); - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java b/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java deleted file mode 100644 index dc57ca3..0000000 --- a/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.dcms.model; - -public class PunishTimesBean { - 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 { - /** - * warn : 0 - * punish : 0 - * persuade : 0 - */ - - private int warn; - private int punish; - private int persuade; - - public int getWarn() { - return warn; - } - - public void setWarn(int warn) { - this.warn = warn; - } - - public int getPunish() { - return punish; - } - - public void setPunish(int punish) { - this.punish = punish; - } - - public int getPersuade() { - return persuade; - } - - public void setPersuade(int persuade) { - this.persuade = persuade; - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java b/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java deleted file mode 100644 index 00b6a98..0000000 --- a/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.casic.dcms.model; - -import java.util.List; - -public class PunishTypeBean { - private int code; - private String message; - private boolean success; - private List data; - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - 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 List getData() { - return data; - } - - public void setData(List data) { - this.data = data; - } - - public static class DataBean { - /** - * punishTime : 2021-01-12 09:08:59 - * punishTypeName : 处罚 - * punishImage : images - * punishType : 1 - * punishRemarks : 处罚 - */ - - private String punishTime; - private String punishTypeName; - private String punishImage; - private String punishType; - private String punishRemarks; - - public String getPunishTime() { - return punishTime; - } - - public void setPunishTime(String punishTime) { - this.punishTime = punishTime; - } - - public String getPunishTypeName() { - return punishTypeName; - } - - public void setPunishTypeName(String punishTypeName) { - this.punishTypeName = punishTypeName; - } - - public String getPunishImage() { - return punishImage; - } - - public void setPunishImage(String punishImage) { - this.punishImage = punishImage; - } - - public String getPunishType() { - return punishType; - } - - public void setPunishType(String punishType) { - this.punishType = punishType; - } - - public String getPunishRemarks() { - return punishRemarks; - } - - public void setPunishRemarks(String punishRemarks) { - this.punishRemarks = punishRemarks; - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/UnitFeatureBean.java b/app/src/main/java/com/casic/dcms/model/UnitFeatureBean.java deleted file mode 100644 index a4d8337..0000000 --- a/app/src/main/java/com/casic/dcms/model/UnitFeatureBean.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.casic.dcms.model; - -public class UnitFeatureBean { - - private String BGID; - private String BGNAME; - private int OBJECTID; - - public String getBGID() { - return BGID; - } - - public void setBGID(String BGID) { - this.BGID = BGID; - } - - public String getBGNAME() { - return BGNAME; - } - - public void setBGNAME(String BGNAME) { - this.BGNAME = BGNAME; - } - - public int getOBJECTID() { - return OBJECTID; - } - - public void setOBJECTID(int OBJECTID) { - this.OBJECTID = OBJECTID; - } -} diff --git a/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java b/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java index 0578f7b..b0c24d5 100644 --- a/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java +++ b/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java @@ -1,9 +1,16 @@ package com.casic.dcms.model; +import android.os.Parcel; +import android.os.Parcelable; + +import androidx.annotation.NonNull; + import java.util.List; -public class WellAlarmListBean { - +/** + * Parcelable 是 Android 平台专门为性能优化而设计的序列化机制,通常比 Serializable 快 10 倍左右 + */ +public class WellAlarmListBean implements Parcelable { private int code; private DataBean data; private String message; @@ -41,7 +48,43 @@ this.success = success; } - public static class DataBean { + public WellAlarmListBean() { + + } + + protected WellAlarmListBean(Parcel in) { + code = in.readInt(); + data = in.readParcelable(DataBean.class.getClassLoader()); + message = in.readString(); + success = in.readByte() != 0; + } + + public static final Creator CREATOR = new Creator() { + @Override + public WellAlarmListBean createFromParcel(Parcel in) { + return new WellAlarmListBean(in); + } + + @Override + public WellAlarmListBean[] newArray(int size) { + return new WellAlarmListBean[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + dest.writeInt(code); + dest.writeParcelable(data, flags); + dest.writeString(message); + dest.writeByte((byte) (success ? 1 : 0)); + } + + public static class DataBean implements Parcelable { private int total; private List rows; @@ -62,7 +105,38 @@ this.rows = rows; } - public static class RowsBean { + public DataBean() { + } + + protected DataBean(Parcel in) { + total = in.readInt(); + rows = in.createTypedArrayList(RowsBean.CREATOR); + } + + public static final Creator CREATOR = new Creator() { + @Override + public DataBean createFromParcel(Parcel in) { + return new DataBean(in); + } + + @Override + public DataBean[] newArray(int size) { + return new DataBean[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(total); + dest.writeTypedList(rows); + } + + public static class RowsBean implements Parcelable { /** * alarmContent : 1 * deptName : 崇仁县城管局 @@ -296,6 +370,79 @@ public void setStatus(String status) { this.status = status; } + + public RowsBean() { + } + + protected RowsBean(Parcel in) { + alarmContent = in.readInt(); + deptName = in.readString(); + jobStatus = in.readString(); + alarmContentName = in.readString(); + wellCode = in.readString(); + alarmTime = in.readString(); + deptid = in.readString(); + alarmTypeName = in.readString(); + alarmMessage = in.readString(); + staff = in.readString(); + deviceId = in.readString(); + jobId = in.readString(); + jobStatusName = in.readString(); + alarmType = in.readString(); + alarmValue = in.readString(); + devcode = in.readString(); + statusName = in.readString(); + alarmLevel = in.readString(); + tel = in.readString(); + id = in.readString(); + wellId = in.readString(); + position = in.readString(); + status = in.readString(); + } + + public static final Creator CREATOR = new Creator() { + @Override + public RowsBean createFromParcel(Parcel in) { + return new RowsBean(in); + } + + @Override + public RowsBean[] newArray(int size) { + return new RowsBean[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(alarmContent); + dest.writeString(deptName); + dest.writeString(jobStatus); + dest.writeString(alarmContentName); + dest.writeString(wellCode); + dest.writeString(alarmTime); + dest.writeString(deptid); + dest.writeString(alarmTypeName); + dest.writeString(alarmMessage); + dest.writeString(staff); + dest.writeString(deviceId); + dest.writeString(jobId); + dest.writeString(jobStatusName); + dest.writeString(alarmType); + dest.writeString(alarmValue); + dest.writeString(devcode); + dest.writeString(statusName); + dest.writeString(alarmLevel); + dest.writeString(tel); + dest.writeString(id); + dest.writeString(wellId); + dest.writeString(position); + dest.writeString(status); + } } } } diff --git a/app/src/main/java/com/casic/dcms/model/WellDetailBean.java b/app/src/main/java/com/casic/dcms/model/WellDetailBean.java index cea8774..4e6c8fd 100644 --- a/app/src/main/java/com/casic/dcms/model/WellDetailBean.java +++ b/app/src/main/java/com/casic/dcms/model/WellDetailBean.java @@ -60,7 +60,6 @@ } public static class FieldAliasesBean { - private String objectid; private String 编号; private String 附属物编码; @@ -190,7 +189,6 @@ } public static class SpatialReferenceBean { - private int wkid; private int latestWkid; @@ -212,7 +210,6 @@ } public static class FieldsBean { - private String name; private String type; private String alias; @@ -252,7 +249,6 @@ } public static class FeaturesBean { - private AttributesBean attributes; private GeometryBean geometry; diff --git a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java index 8b15d77..6f1d941 100644 --- a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java @@ -621,8 +621,8 @@ /** * 报警列表 */ - public static Observable getAlarmList(int limit, int offset) { - return api.getAlarmList(AuthenticationHelper.getToken(), "1", limit, offset); + public static Observable getAlarmList(int offset) { + return api.getAlarmList(AuthenticationHelper.getToken(), "1", LocaleConstant.PAGE_LIMIT, offset); } /** @@ -662,18 +662,15 @@ return api.optionWellStatus(AuthenticationHelper.getToken(), bfzt); } + private static final RetrofitService arcgisApi = RetrofitFactory.createRetrofit( + "http://111.198.10.15:13002", RetrofitService.class, true + ); + /** * 报警窨井详情 */ public static Observable getWellDetailResult(String where) { -// Retrofit retrofit = new Retrofit.Builder() -// .baseUrl("http://111.198.10.15:13002") -// .addConverterFactory(GsonConverterFactory.create())//Gson转换器 -// .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) -// .client(createOKHttpClient())//log拦截器 -// .build(); -// RetrofitService service = retrofit.create(RetrofitService.class); - return api.getWellDetail( + return arcgisApi.getWellDetail( "json", "4326", "4326", "*", true, where ); } diff --git a/app/src/main/java/com/casic/dcms/view/pipeline/AlarmOnMapActivity.java b/app/src/main/java/com/casic/dcms/view/pipeline/AlarmOnMapActivity.java new file mode 100644 index 0000000..e3dc01d --- /dev/null +++ b/app/src/main/java/com/casic/dcms/view/pipeline/AlarmOnMapActivity.java @@ -0,0 +1,212 @@ +package com.casic.dcms.view.pipeline; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.DialogInterface; +import android.graphics.Color; +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; + +import com.casic.dcms.R; +import com.casic.dcms.databinding.ActivityMapAlarmBinding; +import com.casic.dcms.model.WellAlarmListBean; +import com.casic.dcms.model.WellDetailBean; +import com.casic.dcms.utils.ArcGisMapCreator; +import com.casic.dcms.utils.LocaleConstant; +import com.casic.dcms.utils.ViewGroupKit; +import com.casic.dcms.vm.WellViewModel; +import com.esri.arcgisruntime.geometry.Point; +import com.esri.arcgisruntime.mapping.ArcGISMap; +import com.esri.arcgisruntime.mapping.Basemap; +import com.esri.arcgisruntime.mapping.BasemapStyle; +import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; +import com.esri.arcgisruntime.mapping.view.Graphic; +import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; +import com.esri.arcgisruntime.symbology.SimpleMarkerSymbol; +import com.esri.arcgisruntime.util.ListenableList; +import com.pengxh.androidx.lite.base.AndroidxBaseActivity; +import com.pengxh.androidx.lite.utils.LoadState; +import com.pengxh.androidx.lite.utils.LoadingDialog; +import com.pengxh.androidx.lite.widget.TitleBarView; +import com.qmuiteam.qmui.util.QMUIDisplayHelper; +import com.qmuiteam.qmui.widget.dialog.QMUIDialog; +import com.qmuiteam.qmui.widget.popup.QMUIPopup; +import com.qmuiteam.qmui.widget.popup.QMUIPopups; + +import java.util.ArrayList; +import java.util.List; + +public class AlarmOnMapActivity extends AndroidxBaseActivity { + + private static final String TAG = "AlarmOnMapActivity"; + private final Context context = this; + private final List geometryList = new ArrayList<>(); + private WellViewModel wellViewModel; + + @Override + protected void setupTopBarLayout() { + ViewGroupKit.initImmersionBar(binding.rootView, this, true, R.color.white); + binding.titleView.setOnClickListener(new TitleBarView.OnClickListener() { + @Override + public void onLeftClick() { + finish(); + } + + @Override + public void onRightClick() { + + } + }); + } + + @Override + protected void observeRequestState() { + wellViewModel.loadState.observe(this, new Observer() { + @Override + public void onChanged(LoadState loadState) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(AlarmOnMapActivity.this, "数据加载中,请稍后"); + } else { + LoadingDialog.dismiss(); + } + } + }); + } + + @Override + public void initOnCreate(@Nullable Bundle savedInstanceState) { + binding.mapView.setAttributionTextVisible(false);//去掉左下角属性标识 + binding.mapView.setViewpointScaleAsync(64000); + ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_STREETS); + //创建底图、并设置底图图层 + Basemap basemap = new Basemap(ArcGisMapCreator.createNoGridLayer()); + arcGISMap.setBasemap(basemap); + binding.mapView.setMap(arcGISMap); + + wellViewModel = new ViewModelProvider(this).get(WellViewModel.class); + wellViewModel.resultModel.observe(this, new Observer() { + @Override + public void onChanged(WellDetailBean wellDetailBean) { + List features = wellDetailBean.getFeatures(); + if (features.size() > 0) { + WellDetailBean.FeaturesBean featuresBean = features.get(0); + //将获取到的井数据缓存起来 + geometryList.add(featuresBean); + WellDetailBean.FeaturesBean.GeometryBean geometryBean = featuresBean.getGeometry(); + //每获取一个点就绘制出 + addMarker(new Point(geometryBean.getX(), geometryBean.getY())); + } + } + }); + + Bundle extras = getIntent().getExtras(); + if (extras != null) { + List dataBeans = extras.getParcelableArrayList("rows_list"); + if (dataBeans == null) { + return; + } + for (WellAlarmListBean.DataBean.RowsBean dataBean : dataBeans) { + String queryParam = "编号='" + dataBean.getWellCode() + "'"; + Log.d(TAG, "queryParam: " + queryParam); + wellViewModel.getWellDetail(context, queryParam); + } + } + } + + @SuppressLint("ClickableViewAccessibility") + @Override + public void initEvent() { + binding.expandMapView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 0.5); + } + }); + binding.minusMapView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 2); + } + }); + + binding.mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, binding.mapView) { + @Override + public boolean onSingleTapConfirmed(MotionEvent e) { + android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); + Point clickPoint = binding.mapView.screenToLocation(screenPoint); + if (geometryList.size() > 0) { + List tempList = new ArrayList<>(); + for (WellDetailBean.FeaturesBean featuresBean : geometryList) { + WellDetailBean.FeaturesBean.GeometryBean dataBean = featuresBean.getGeometry(); + if (Math.abs(dataBean.getX() - clickPoint.getX()) <= 10 * LocaleConstant.DELTA_LNG_10 && + Math.abs(dataBean.getY() - clickPoint.getY()) <= 10 * LocaleConstant.DELTA_LNG_10) { + tempList.add(featuresBean); + } + } + if (tempList.size() > 0) { + QMUIDialog.MenuDialogBuilder menuDialogBuilder = new QMUIDialog.MenuDialogBuilder(context); + menuDialogBuilder.setTitle("请选择您要查看的窨井"); + for (WellDetailBean.FeaturesBean dataBean : tempList) { + menuDialogBuilder.addItem(dataBean.getAttributes().get编号(), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + + View popupView = LayoutInflater.from(context).inflate(R.layout.popu_well, null); + TextView wellCodeView = popupView.findViewById(R.id.wellCodeView); + TextView wellTypeView = popupView.findViewById(R.id.wellTypeView); + TextView wellPositionView = popupView.findViewById(R.id.wellPositionView); + + WellDetailBean.FeaturesBean.AttributesBean attributes = dataBean.getAttributes(); + wellCodeView.setText(attributes.get编号()); + wellTypeView.setText(attributes.get附属物名称()); + wellPositionView.setText(attributes.get所属道路()); + + QMUIPopups.popup(context, QMUIDisplayHelper.dp2px(context, 290)) + .preferredDirection(QMUIPopup.DIRECTION_BOTTOM) + .view(popupView) + .edgeProtection(QMUIDisplayHelper.dp2px(context, 20)) + .dimAmount(0.6f) + .animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER) + .onDismiss(null) + .show(binding.mapView); + } + }); + } + menuDialogBuilder.create().show(); + } + } + return super.onSingleTapConfirmed(e); + } + }); + } + + protected void onResume() { + super.onResume(); + binding.mapView.resume(); + } + + @Override + protected void onPause() { + super.onPause(); + binding.mapView.pause(); + } + + private void addMarker(Point point) { + SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.RED, 10); + Graphic graphic = new Graphic(point, simpleMarkerSymbol); + GraphicsOverlay mGraphicsOverlay = new GraphicsOverlay(); + ListenableList overlayGraphics = mGraphicsOverlay.getGraphics(); + ListenableList graphicsOverlays = binding.mapView.getGraphicsOverlays(); + overlayGraphics.add(graphic); + graphicsOverlays.add(mGraphicsOverlay); + } +} diff --git a/app/src/main/java/com/casic/dcms/view/pipeline/PipelineManagerActivity.java b/app/src/main/java/com/casic/dcms/view/pipeline/PipelineManagerActivity.java index e2e6656..eac37ed 100644 --- a/app/src/main/java/com/casic/dcms/view/pipeline/PipelineManagerActivity.java +++ b/app/src/main/java/com/casic/dcms/view/pipeline/PipelineManagerActivity.java @@ -1,6 +1,7 @@ package com.casic.dcms.view.pipeline; import android.content.Context; +import android.content.Intent; import android.graphics.Color; import android.os.Bundle; import android.os.Handler; @@ -75,7 +76,13 @@ showBatchCancelDialog(); break; case 1: - ContextKit.navigatePageTo(context, WarningOnMapActivity.class); + if (dataBeans.isEmpty()) { + StringKit.show(context, "无报警数据"); + return; + } + Intent intent = new Intent(context, AlarmOnMapActivity.class); + intent.putParcelableArrayListExtra("rows_list", new ArrayList<>(dataBeans)); + context.startActivity(intent); break; case 2: ContextKit.navigatePageTo(context, WellListActivity.class); @@ -153,7 +160,7 @@ } private void getAlarmList() { - alarmViewModel.getAlarmList(this, LocaleConstant.PAGE_LIMIT, page); + alarmViewModel.getAlarmList(this, page); } @Override diff --git a/app/src/main/java/com/casic/dcms/view/pipeline/WarningOnMapActivity.java b/app/src/main/java/com/casic/dcms/view/pipeline/WarningOnMapActivity.java deleted file mode 100644 index 66a38d0..0000000 --- a/app/src/main/java/com/casic/dcms/view/pipeline/WarningOnMapActivity.java +++ /dev/null @@ -1,230 +0,0 @@ -package com.casic.dcms.view.pipeline; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.content.DialogInterface; -import android.graphics.Color; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.widget.TextView; - -import androidx.annotation.Nullable; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProvider; - -import com.casic.dcms.R; -import com.casic.dcms.databinding.ActivityMapWarningBinding; -import com.casic.dcms.model.WellAlarmListBean; -import com.casic.dcms.model.WellDetailBean; -import com.casic.dcms.utils.ArcGisMapCreator; -import com.casic.dcms.utils.LocaleConstant; -import com.casic.dcms.utils.ViewGroupKit; -import com.casic.dcms.vm.AlarmViewModel; -import com.casic.dcms.vm.WellViewModel; -import com.esri.arcgisruntime.geometry.Point; -import com.esri.arcgisruntime.mapping.ArcGISMap; -import com.esri.arcgisruntime.mapping.Basemap; -import com.esri.arcgisruntime.mapping.BasemapStyle; -import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; -import com.esri.arcgisruntime.mapping.view.Graphic; -import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; -import com.esri.arcgisruntime.symbology.SimpleMarkerSymbol; -import com.esri.arcgisruntime.util.ListenableList; -import com.pengxh.androidx.lite.base.AndroidxBaseActivity; -import com.pengxh.androidx.lite.utils.LoadState; -import com.pengxh.androidx.lite.utils.LoadingDialog; -import com.pengxh.androidx.lite.utils.SaveKeyValues; -import com.pengxh.androidx.lite.widget.TitleBarView; -import com.qmuiteam.qmui.util.QMUIDisplayHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; -import com.qmuiteam.qmui.widget.popup.QMUIPopup; -import com.qmuiteam.qmui.widget.popup.QMUIPopups; - -import java.util.ArrayList; -import java.util.List; - -public class WarningOnMapActivity extends AndroidxBaseActivity { - - private static final String TAG = "WarningOnMapActivity"; - private final Context context = this; - private final List geometryList = new ArrayList<>(); - private AlarmViewModel alarmViewModel; - private WellViewModel wellViewModel; - - @Override - protected void setupTopBarLayout() { - ViewGroupKit.initImmersionBar(binding.rootView, this, true, R.color.white); - binding.titleView.setOnClickListener(new TitleBarView.OnClickListener() { - @Override - public void onLeftClick() { - finish(); - } - - @Override - public void onRightClick() { - - } - }); - } - - @Override - protected void observeRequestState() { - alarmViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - if (loadState == LoadState.Loading) { - LoadingDialog.show(WarningOnMapActivity.this, "数据加载中,请稍后"); - } else { - LoadingDialog.dismiss(); - } - } - }); - - wellViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - - } - }); - } - - @Override - public void initOnCreate(@Nullable Bundle savedInstanceState) { - binding.mapView.setAttributionTextVisible(false);//去掉左下角属性标识 - binding.mapView.setViewpointScaleAsync(64000); - ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_STREETS); - //创建底图、并设置底图图层 - Basemap basemap = new Basemap(ArcGisMapCreator.createNoGridLayer()); - arcGISMap.setBasemap(basemap); - binding.mapView.setMap(arcGISMap); - - int alarmTotal = (int) SaveKeyValues.getValue("alarmTotal", LocaleConstant.PAGE_LIMIT); - alarmViewModel = new ViewModelProvider(this).get(AlarmViewModel.class); - alarmViewModel.wellAlarmListResult.observe(this, new Observer() { - @Override - public void onChanged(WellAlarmListBean alarmDataBean) { - if (alarmDataBean.getCode() == 200) { - List dataRows = alarmDataBean.getData().getRows(); - for (WellAlarmListBean.DataBean.RowsBean rowsBean : dataRows) { - String queryParam = "编号='" + rowsBean.getWellCode() + "'"; - wellViewModel.getWellDetail(context, queryParam); - } - } - } - }); - alarmViewModel.getAlarmList(this, alarmTotal, 1); - - wellViewModel = new ViewModelProvider(this).get(WellViewModel.class); - wellViewModel.resultModel.observe(this, new Observer() { - @Override - public void onChanged(WellDetailBean wellDetailBean) { - List features = wellDetailBean.getFeatures(); - if (features.size() > 0) { - WellDetailBean.FeaturesBean featuresBean = features.get(0); - //将获取到的井数据缓存起来 - geometryList.add(featuresBean); - WellDetailBean.FeaturesBean.GeometryBean geometryBean = featuresBean.getGeometry(); - //每获取一个点就绘制出 - addMarker(new Point(geometryBean.getX(), geometryBean.getY())); - } - } - }); - } - - @SuppressLint("ClickableViewAccessibility") - @Override - public void initEvent() { - binding.expandMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 0.5); - } - }); - binding.minusMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 2); - } - }); - - binding.mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, binding.mapView) { - @Override - public boolean onSingleTapConfirmed(MotionEvent e) { - android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); - Point clickPoint = binding.mapView.screenToLocation(screenPoint); - if (geometryList.size() > 0) { - List tempList = new ArrayList<>(); - for (WellDetailBean.FeaturesBean featuresBean : geometryList) { - WellDetailBean.FeaturesBean.GeometryBean dataBean = featuresBean.getGeometry(); - if (Math.abs(dataBean.getX() - clickPoint.getX()) <= 10 * LocaleConstant.DELTA_LNG_10 && - Math.abs(dataBean.getY() - clickPoint.getY()) <= 10 * LocaleConstant.DELTA_LNG_10) { - tempList.add(featuresBean); - } - } - if (tempList.size() > 0) { - QMUIDialog.MenuDialogBuilder menuDialogBuilder = new QMUIDialog.MenuDialogBuilder(context); - menuDialogBuilder.setTitle("请选择您要查看的窨井"); - for (WellDetailBean.FeaturesBean dataBean : tempList) { - menuDialogBuilder.addItem(dataBean.getAttributes().get编号(), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - - View popupView = LayoutInflater.from(context).inflate(R.layout.popu_well, null); - TextView wellCodeView = popupView.findViewById(R.id.wellCodeView); - TextView wellTypeView = popupView.findViewById(R.id.wellTypeView); - TextView wellPositionView = popupView.findViewById(R.id.wellPositionView); - - WellDetailBean.FeaturesBean.AttributesBean attributes = dataBean.getAttributes(); - wellCodeView.setText(attributes.get编号()); - wellTypeView.setText(attributes.get附属物名称()); - wellPositionView.setText(attributes.get所属道路()); - - QMUIPopups.popup(context, QMUIDisplayHelper.dp2px(context, 290)) - .preferredDirection(QMUIPopup.DIRECTION_BOTTOM) - .view(popupView) - .edgeProtection(QMUIDisplayHelper.dp2px(context, 20)) - .dimAmount(0.6f) - .animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER) - .onDismiss(null) - .show(binding.mapView); - } - }); - } - menuDialogBuilder.create().show(); - } - } - return super.onSingleTapConfirmed(e); - } - }); - } - - protected void onResume() { - super.onResume(); - binding.mapView.resume(); - } - - @Override - protected void onPause() { - super.onPause(); - binding.mapView.pause(); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - binding.mapView.dispose(); - } - - private void addMarker(Point point) { - SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.RED, 10); - Graphic graphic = new Graphic(point, simpleMarkerSymbol); - GraphicsOverlay mGraphicsOverlay = new GraphicsOverlay(); - ListenableList overlayGraphics = mGraphicsOverlay.getGraphics(); - ListenableList graphicsOverlays = binding.mapView.getGraphicsOverlays(); - overlayGraphics.add(graphic); - graphicsOverlays.add(mGraphicsOverlay); - } -} diff --git a/app/src/main/java/com/casic/dcms/vm/AlarmViewModel.java b/app/src/main/java/com/casic/dcms/vm/AlarmViewModel.java index 1e5dabd..e08affa 100644 --- a/app/src/main/java/com/casic/dcms/vm/AlarmViewModel.java +++ b/app/src/main/java/com/casic/dcms/vm/AlarmViewModel.java @@ -25,9 +25,9 @@ public MutableLiveData wellAlarmListResult = new MutableLiveData<>(); public MutableLiveData cancelActionModel = new MutableLiveData<>(); - public void getAlarmList(Context context, int limit, int offset) { + public void getAlarmList(Context context, int offset) { loadState.setValue(LoadState.Loading); - Observable alarmListObservable = RetrofitServiceManager.getAlarmList(limit, offset); + Observable alarmListObservable = RetrofitServiceManager.getAlarmList(offset); ObserverSubscriber.addSubscribe(alarmListObservable, new ObserverSubscriber.OnObserverCallback() { @Override public void onCompleted() { diff --git a/.gitignore b/.gitignore index f0f71e2..ee6b213 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,12 @@ *.iml .gradle /local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml +/.idea .DS_Store /build /captures .externalNativeBuild .cxx .idea +*.apk +*.json diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fdb7255..6873489 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -109,7 +109,7 @@ - + diff --git a/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java b/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java index 2dcdc64..0364fc7 100644 --- a/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java +++ b/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java @@ -9,6 +9,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; @@ -25,7 +26,6 @@ private final Context context; private final List dataRows; private final LayoutInflater layoutInflater; - private PunishTypeAdapter adapter; public PackageCaseListAdapter(Context context, List dataRows) { this.context = context; @@ -36,7 +36,7 @@ @NonNull @Override public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new ItemViewHolder(layoutInflater.inflate(R.layout.item_package_rv, parent, false)); + return new ItemViewHolder(layoutInflater.inflate(R.layout.item_package_rv_l, parent, false)); } @Override @@ -57,16 +57,67 @@ return dataRows.size(); } - @SuppressLint("NotifyDataSetChanged") - public void refresh(List dataRows) { - this.dataRows.clear(); - this.dataRows.addAll(dataRows); - notifyDataSetChanged(); + public void refresh(List newRows) { + DiffUtil.Callback diffCallback = new DiffUtil.Callback() { + + @Override + public int getOldListSize() { + return dataRows.size(); + } + + @Override + public int getNewListSize() { + return newRows.size(); + } + + @Override + public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { + if (dataRows == null || newRows == null) { + return false; + } + + // 检查索引是否在有效范围内 + if (oldItemPosition < 0 || oldItemPosition >= dataRows.size() || + newItemPosition < 0 || newItemPosition >= newRows.size()) { + return false; + } + + // 获取元素并进行比较 + Object oldItem = dataRows.get(oldItemPosition); + Object newItem = newRows.get(newItemPosition); + + // 处理空指针情况 + if (oldItem == null && newItem == null) { + return true; + } + if (oldItem == null || newItem == null) { + return false; + } + + return oldItem.equals(newItem); + } + + @Override + public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { + return dataRows.get(oldItemPosition) == newRows.get(newItemPosition); + } + }; + + DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallback); + + dataRows.clear(); + dataRows.addAll(newRows); + + diffResult.dispatchUpdatesTo(this); } - public void loadMore(List dataRows) { - this.dataRows.addAll(dataRows); - notifyItemRangeInserted(this.dataRows.size(), dataRows.size()); + public void loadMore(List newRows) { + if (newRows.isEmpty()) { + return; + } + int startPosition = this.dataRows.size(); + this.dataRows.addAll(newRows); + notifyItemRangeInserted(startPosition, newRows.size()); } class ItemViewHolder extends RecyclerView.ViewHolder { @@ -84,7 +135,6 @@ casePunishView = itemView.findViewById(R.id.casePunishView); } - void bindView(PackageCaseBean.DataBean.RowsBean rowsBean) { //三包核实图片 String fileIdVerify = rowsBean.getFileIdVerify(); @@ -97,45 +147,6 @@ } caseTitleView.setText(rowsBean.getDescription()); caseDateView.setText("上报时间:" + rowsBean.getReportTime()); -// HttpRequestHelper.doRequest(LocaleConstant.SHOP_PUNISH_LIST, rowsBean.getShopId(), new IHttpRequestListener() { -// @Override -// public void onSuccess(ResponseBody resultBean) { -// try { -// PunishTypeBean punishTypeBean = gson.fromJson(resultBean.string(), PunishTypeBean.class); -// if (punishTypeBean.getData().size() != 0) { -// //获取商铺处罚次数 -// HttpRequestHelper.doRequest(LocaleConstant.SHOP_PUNISH_TYPE, rowsBean.getShopId(), new IHttpRequestListener() { -// @Override -// public void onSuccess(ResponseBody resultBean) { -// try { -// PunishTimesBean punishTimesBean = gson.fromJson(resultBean.string(), PunishTimesBean.class); -// -// adapter = new PunishTypeAdapter(context, punishTypeBean.getData(), punishTimesBean.getData()); -// LinearLayoutManager layoutManager = new LinearLayoutManager(context); -// layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); -// punishRecyclerView.setLayoutManager(layoutManager); -// punishRecyclerView.setAdapter(adapter); -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } -// -// @Override -// public void onFailure(Throwable throwable) { -// -// } -// }); -// } -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } -// -// @Override -// public void onFailure(Throwable throwable) { -// -// } -// }); } } diff --git a/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java b/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java deleted file mode 100644 index 2e178e5..0000000 --- a/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.casic.dcms.adapter; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.core.content.ContextCompat; -import androidx.recyclerview.widget.RecyclerView; - -import com.casic.dcms.R; -import com.casic.dcms.model.PunishTimesBean; -import com.casic.dcms.model.PunishTypeBean; - -import java.util.List; - -@SuppressLint("SetTextI18n") -public class PunishTypeAdapter extends RecyclerView.Adapter { - - private final Context context; - private final List dataRows; - private final PunishTimesBean.DataBean dataBean; - private final LayoutInflater layoutInflater; - - PunishTypeAdapter(Context context, List dataRows, PunishTimesBean.DataBean dataBean) { - this.context = context; - this.dataRows = dataRows; - this.dataBean = dataBean; - this.layoutInflater = LayoutInflater.from(context); - } - - @NonNull - @Override - public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new ItemViewHolder(layoutInflater.inflate(R.layout.item_punish_recycleview, parent, false)); - } - - @Override - public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { - String typeName = dataRows.get(position).getPunishTypeName(); - int color, times; - switch (typeName) { - case "劝导": - times = dataBean.getPersuade(); - color = ContextCompat.getColor(context, R.color.persuadeColor); - break; - case "警告": - times = dataBean.getWarn(); - color = ContextCompat.getColor(context, R.color.warnColor); - break; - case "处罚": - times = dataBean.getPunish(); - color = ContextCompat.getColor(context, R.color.punishColor); - break; - default: - times = 0; - color = ContextCompat.getColor(context, R.color.mainThemeColor); - break; - } - if (times == 0) { - holder.punishTypeView.setVisibility(View.GONE); - } else { - holder.punishTypeView.setText(typeName + " x " + times); - holder.punishTypeView.setBackgroundColor(color); - } - } - - @Override - public int getItemCount() { - return dataRows.size(); - } - - static class ItemViewHolder extends RecyclerView.ViewHolder { - - private final TextView punishTypeView; - - ItemViewHolder(@NonNull View itemView) { - super(itemView); - punishTypeView = itemView.findViewById(R.id.punishTypeView); - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java b/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java deleted file mode 100644 index dc57ca3..0000000 --- a/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.dcms.model; - -public class PunishTimesBean { - 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 { - /** - * warn : 0 - * punish : 0 - * persuade : 0 - */ - - private int warn; - private int punish; - private int persuade; - - public int getWarn() { - return warn; - } - - public void setWarn(int warn) { - this.warn = warn; - } - - public int getPunish() { - return punish; - } - - public void setPunish(int punish) { - this.punish = punish; - } - - public int getPersuade() { - return persuade; - } - - public void setPersuade(int persuade) { - this.persuade = persuade; - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java b/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java deleted file mode 100644 index 00b6a98..0000000 --- a/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.casic.dcms.model; - -import java.util.List; - -public class PunishTypeBean { - private int code; - private String message; - private boolean success; - private List data; - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - 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 List getData() { - return data; - } - - public void setData(List data) { - this.data = data; - } - - public static class DataBean { - /** - * punishTime : 2021-01-12 09:08:59 - * punishTypeName : 处罚 - * punishImage : images - * punishType : 1 - * punishRemarks : 处罚 - */ - - private String punishTime; - private String punishTypeName; - private String punishImage; - private String punishType; - private String punishRemarks; - - public String getPunishTime() { - return punishTime; - } - - public void setPunishTime(String punishTime) { - this.punishTime = punishTime; - } - - public String getPunishTypeName() { - return punishTypeName; - } - - public void setPunishTypeName(String punishTypeName) { - this.punishTypeName = punishTypeName; - } - - public String getPunishImage() { - return punishImage; - } - - public void setPunishImage(String punishImage) { - this.punishImage = punishImage; - } - - public String getPunishType() { - return punishType; - } - - public void setPunishType(String punishType) { - this.punishType = punishType; - } - - public String getPunishRemarks() { - return punishRemarks; - } - - public void setPunishRemarks(String punishRemarks) { - this.punishRemarks = punishRemarks; - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/UnitFeatureBean.java b/app/src/main/java/com/casic/dcms/model/UnitFeatureBean.java deleted file mode 100644 index a4d8337..0000000 --- a/app/src/main/java/com/casic/dcms/model/UnitFeatureBean.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.casic.dcms.model; - -public class UnitFeatureBean { - - private String BGID; - private String BGNAME; - private int OBJECTID; - - public String getBGID() { - return BGID; - } - - public void setBGID(String BGID) { - this.BGID = BGID; - } - - public String getBGNAME() { - return BGNAME; - } - - public void setBGNAME(String BGNAME) { - this.BGNAME = BGNAME; - } - - public int getOBJECTID() { - return OBJECTID; - } - - public void setOBJECTID(int OBJECTID) { - this.OBJECTID = OBJECTID; - } -} diff --git a/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java b/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java index 0578f7b..b0c24d5 100644 --- a/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java +++ b/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java @@ -1,9 +1,16 @@ package com.casic.dcms.model; +import android.os.Parcel; +import android.os.Parcelable; + +import androidx.annotation.NonNull; + import java.util.List; -public class WellAlarmListBean { - +/** + * Parcelable 是 Android 平台专门为性能优化而设计的序列化机制,通常比 Serializable 快 10 倍左右 + */ +public class WellAlarmListBean implements Parcelable { private int code; private DataBean data; private String message; @@ -41,7 +48,43 @@ this.success = success; } - public static class DataBean { + public WellAlarmListBean() { + + } + + protected WellAlarmListBean(Parcel in) { + code = in.readInt(); + data = in.readParcelable(DataBean.class.getClassLoader()); + message = in.readString(); + success = in.readByte() != 0; + } + + public static final Creator CREATOR = new Creator() { + @Override + public WellAlarmListBean createFromParcel(Parcel in) { + return new WellAlarmListBean(in); + } + + @Override + public WellAlarmListBean[] newArray(int size) { + return new WellAlarmListBean[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + dest.writeInt(code); + dest.writeParcelable(data, flags); + dest.writeString(message); + dest.writeByte((byte) (success ? 1 : 0)); + } + + public static class DataBean implements Parcelable { private int total; private List rows; @@ -62,7 +105,38 @@ this.rows = rows; } - public static class RowsBean { + public DataBean() { + } + + protected DataBean(Parcel in) { + total = in.readInt(); + rows = in.createTypedArrayList(RowsBean.CREATOR); + } + + public static final Creator CREATOR = new Creator() { + @Override + public DataBean createFromParcel(Parcel in) { + return new DataBean(in); + } + + @Override + public DataBean[] newArray(int size) { + return new DataBean[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(total); + dest.writeTypedList(rows); + } + + public static class RowsBean implements Parcelable { /** * alarmContent : 1 * deptName : 崇仁县城管局 @@ -296,6 +370,79 @@ public void setStatus(String status) { this.status = status; } + + public RowsBean() { + } + + protected RowsBean(Parcel in) { + alarmContent = in.readInt(); + deptName = in.readString(); + jobStatus = in.readString(); + alarmContentName = in.readString(); + wellCode = in.readString(); + alarmTime = in.readString(); + deptid = in.readString(); + alarmTypeName = in.readString(); + alarmMessage = in.readString(); + staff = in.readString(); + deviceId = in.readString(); + jobId = in.readString(); + jobStatusName = in.readString(); + alarmType = in.readString(); + alarmValue = in.readString(); + devcode = in.readString(); + statusName = in.readString(); + alarmLevel = in.readString(); + tel = in.readString(); + id = in.readString(); + wellId = in.readString(); + position = in.readString(); + status = in.readString(); + } + + public static final Creator CREATOR = new Creator() { + @Override + public RowsBean createFromParcel(Parcel in) { + return new RowsBean(in); + } + + @Override + public RowsBean[] newArray(int size) { + return new RowsBean[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(alarmContent); + dest.writeString(deptName); + dest.writeString(jobStatus); + dest.writeString(alarmContentName); + dest.writeString(wellCode); + dest.writeString(alarmTime); + dest.writeString(deptid); + dest.writeString(alarmTypeName); + dest.writeString(alarmMessage); + dest.writeString(staff); + dest.writeString(deviceId); + dest.writeString(jobId); + dest.writeString(jobStatusName); + dest.writeString(alarmType); + dest.writeString(alarmValue); + dest.writeString(devcode); + dest.writeString(statusName); + dest.writeString(alarmLevel); + dest.writeString(tel); + dest.writeString(id); + dest.writeString(wellId); + dest.writeString(position); + dest.writeString(status); + } } } } diff --git a/app/src/main/java/com/casic/dcms/model/WellDetailBean.java b/app/src/main/java/com/casic/dcms/model/WellDetailBean.java index cea8774..4e6c8fd 100644 --- a/app/src/main/java/com/casic/dcms/model/WellDetailBean.java +++ b/app/src/main/java/com/casic/dcms/model/WellDetailBean.java @@ -60,7 +60,6 @@ } public static class FieldAliasesBean { - private String objectid; private String 编号; private String 附属物编码; @@ -190,7 +189,6 @@ } public static class SpatialReferenceBean { - private int wkid; private int latestWkid; @@ -212,7 +210,6 @@ } public static class FieldsBean { - private String name; private String type; private String alias; @@ -252,7 +249,6 @@ } public static class FeaturesBean { - private AttributesBean attributes; private GeometryBean geometry; diff --git a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java index 8b15d77..6f1d941 100644 --- a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java @@ -621,8 +621,8 @@ /** * 报警列表 */ - public static Observable getAlarmList(int limit, int offset) { - return api.getAlarmList(AuthenticationHelper.getToken(), "1", limit, offset); + public static Observable getAlarmList(int offset) { + return api.getAlarmList(AuthenticationHelper.getToken(), "1", LocaleConstant.PAGE_LIMIT, offset); } /** @@ -662,18 +662,15 @@ return api.optionWellStatus(AuthenticationHelper.getToken(), bfzt); } + private static final RetrofitService arcgisApi = RetrofitFactory.createRetrofit( + "http://111.198.10.15:13002", RetrofitService.class, true + ); + /** * 报警窨井详情 */ public static Observable getWellDetailResult(String where) { -// Retrofit retrofit = new Retrofit.Builder() -// .baseUrl("http://111.198.10.15:13002") -// .addConverterFactory(GsonConverterFactory.create())//Gson转换器 -// .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) -// .client(createOKHttpClient())//log拦截器 -// .build(); -// RetrofitService service = retrofit.create(RetrofitService.class); - return api.getWellDetail( + return arcgisApi.getWellDetail( "json", "4326", "4326", "*", true, where ); } diff --git a/app/src/main/java/com/casic/dcms/view/pipeline/AlarmOnMapActivity.java b/app/src/main/java/com/casic/dcms/view/pipeline/AlarmOnMapActivity.java new file mode 100644 index 0000000..e3dc01d --- /dev/null +++ b/app/src/main/java/com/casic/dcms/view/pipeline/AlarmOnMapActivity.java @@ -0,0 +1,212 @@ +package com.casic.dcms.view.pipeline; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.DialogInterface; +import android.graphics.Color; +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; + +import com.casic.dcms.R; +import com.casic.dcms.databinding.ActivityMapAlarmBinding; +import com.casic.dcms.model.WellAlarmListBean; +import com.casic.dcms.model.WellDetailBean; +import com.casic.dcms.utils.ArcGisMapCreator; +import com.casic.dcms.utils.LocaleConstant; +import com.casic.dcms.utils.ViewGroupKit; +import com.casic.dcms.vm.WellViewModel; +import com.esri.arcgisruntime.geometry.Point; +import com.esri.arcgisruntime.mapping.ArcGISMap; +import com.esri.arcgisruntime.mapping.Basemap; +import com.esri.arcgisruntime.mapping.BasemapStyle; +import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; +import com.esri.arcgisruntime.mapping.view.Graphic; +import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; +import com.esri.arcgisruntime.symbology.SimpleMarkerSymbol; +import com.esri.arcgisruntime.util.ListenableList; +import com.pengxh.androidx.lite.base.AndroidxBaseActivity; +import com.pengxh.androidx.lite.utils.LoadState; +import com.pengxh.androidx.lite.utils.LoadingDialog; +import com.pengxh.androidx.lite.widget.TitleBarView; +import com.qmuiteam.qmui.util.QMUIDisplayHelper; +import com.qmuiteam.qmui.widget.dialog.QMUIDialog; +import com.qmuiteam.qmui.widget.popup.QMUIPopup; +import com.qmuiteam.qmui.widget.popup.QMUIPopups; + +import java.util.ArrayList; +import java.util.List; + +public class AlarmOnMapActivity extends AndroidxBaseActivity { + + private static final String TAG = "AlarmOnMapActivity"; + private final Context context = this; + private final List geometryList = new ArrayList<>(); + private WellViewModel wellViewModel; + + @Override + protected void setupTopBarLayout() { + ViewGroupKit.initImmersionBar(binding.rootView, this, true, R.color.white); + binding.titleView.setOnClickListener(new TitleBarView.OnClickListener() { + @Override + public void onLeftClick() { + finish(); + } + + @Override + public void onRightClick() { + + } + }); + } + + @Override + protected void observeRequestState() { + wellViewModel.loadState.observe(this, new Observer() { + @Override + public void onChanged(LoadState loadState) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(AlarmOnMapActivity.this, "数据加载中,请稍后"); + } else { + LoadingDialog.dismiss(); + } + } + }); + } + + @Override + public void initOnCreate(@Nullable Bundle savedInstanceState) { + binding.mapView.setAttributionTextVisible(false);//去掉左下角属性标识 + binding.mapView.setViewpointScaleAsync(64000); + ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_STREETS); + //创建底图、并设置底图图层 + Basemap basemap = new Basemap(ArcGisMapCreator.createNoGridLayer()); + arcGISMap.setBasemap(basemap); + binding.mapView.setMap(arcGISMap); + + wellViewModel = new ViewModelProvider(this).get(WellViewModel.class); + wellViewModel.resultModel.observe(this, new Observer() { + @Override + public void onChanged(WellDetailBean wellDetailBean) { + List features = wellDetailBean.getFeatures(); + if (features.size() > 0) { + WellDetailBean.FeaturesBean featuresBean = features.get(0); + //将获取到的井数据缓存起来 + geometryList.add(featuresBean); + WellDetailBean.FeaturesBean.GeometryBean geometryBean = featuresBean.getGeometry(); + //每获取一个点就绘制出 + addMarker(new Point(geometryBean.getX(), geometryBean.getY())); + } + } + }); + + Bundle extras = getIntent().getExtras(); + if (extras != null) { + List dataBeans = extras.getParcelableArrayList("rows_list"); + if (dataBeans == null) { + return; + } + for (WellAlarmListBean.DataBean.RowsBean dataBean : dataBeans) { + String queryParam = "编号='" + dataBean.getWellCode() + "'"; + Log.d(TAG, "queryParam: " + queryParam); + wellViewModel.getWellDetail(context, queryParam); + } + } + } + + @SuppressLint("ClickableViewAccessibility") + @Override + public void initEvent() { + binding.expandMapView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 0.5); + } + }); + binding.minusMapView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 2); + } + }); + + binding.mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, binding.mapView) { + @Override + public boolean onSingleTapConfirmed(MotionEvent e) { + android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); + Point clickPoint = binding.mapView.screenToLocation(screenPoint); + if (geometryList.size() > 0) { + List tempList = new ArrayList<>(); + for (WellDetailBean.FeaturesBean featuresBean : geometryList) { + WellDetailBean.FeaturesBean.GeometryBean dataBean = featuresBean.getGeometry(); + if (Math.abs(dataBean.getX() - clickPoint.getX()) <= 10 * LocaleConstant.DELTA_LNG_10 && + Math.abs(dataBean.getY() - clickPoint.getY()) <= 10 * LocaleConstant.DELTA_LNG_10) { + tempList.add(featuresBean); + } + } + if (tempList.size() > 0) { + QMUIDialog.MenuDialogBuilder menuDialogBuilder = new QMUIDialog.MenuDialogBuilder(context); + menuDialogBuilder.setTitle("请选择您要查看的窨井"); + for (WellDetailBean.FeaturesBean dataBean : tempList) { + menuDialogBuilder.addItem(dataBean.getAttributes().get编号(), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + + View popupView = LayoutInflater.from(context).inflate(R.layout.popu_well, null); + TextView wellCodeView = popupView.findViewById(R.id.wellCodeView); + TextView wellTypeView = popupView.findViewById(R.id.wellTypeView); + TextView wellPositionView = popupView.findViewById(R.id.wellPositionView); + + WellDetailBean.FeaturesBean.AttributesBean attributes = dataBean.getAttributes(); + wellCodeView.setText(attributes.get编号()); + wellTypeView.setText(attributes.get附属物名称()); + wellPositionView.setText(attributes.get所属道路()); + + QMUIPopups.popup(context, QMUIDisplayHelper.dp2px(context, 290)) + .preferredDirection(QMUIPopup.DIRECTION_BOTTOM) + .view(popupView) + .edgeProtection(QMUIDisplayHelper.dp2px(context, 20)) + .dimAmount(0.6f) + .animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER) + .onDismiss(null) + .show(binding.mapView); + } + }); + } + menuDialogBuilder.create().show(); + } + } + return super.onSingleTapConfirmed(e); + } + }); + } + + protected void onResume() { + super.onResume(); + binding.mapView.resume(); + } + + @Override + protected void onPause() { + super.onPause(); + binding.mapView.pause(); + } + + private void addMarker(Point point) { + SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.RED, 10); + Graphic graphic = new Graphic(point, simpleMarkerSymbol); + GraphicsOverlay mGraphicsOverlay = new GraphicsOverlay(); + ListenableList overlayGraphics = mGraphicsOverlay.getGraphics(); + ListenableList graphicsOverlays = binding.mapView.getGraphicsOverlays(); + overlayGraphics.add(graphic); + graphicsOverlays.add(mGraphicsOverlay); + } +} diff --git a/app/src/main/java/com/casic/dcms/view/pipeline/PipelineManagerActivity.java b/app/src/main/java/com/casic/dcms/view/pipeline/PipelineManagerActivity.java index e2e6656..eac37ed 100644 --- a/app/src/main/java/com/casic/dcms/view/pipeline/PipelineManagerActivity.java +++ b/app/src/main/java/com/casic/dcms/view/pipeline/PipelineManagerActivity.java @@ -1,6 +1,7 @@ package com.casic.dcms.view.pipeline; import android.content.Context; +import android.content.Intent; import android.graphics.Color; import android.os.Bundle; import android.os.Handler; @@ -75,7 +76,13 @@ showBatchCancelDialog(); break; case 1: - ContextKit.navigatePageTo(context, WarningOnMapActivity.class); + if (dataBeans.isEmpty()) { + StringKit.show(context, "无报警数据"); + return; + } + Intent intent = new Intent(context, AlarmOnMapActivity.class); + intent.putParcelableArrayListExtra("rows_list", new ArrayList<>(dataBeans)); + context.startActivity(intent); break; case 2: ContextKit.navigatePageTo(context, WellListActivity.class); @@ -153,7 +160,7 @@ } private void getAlarmList() { - alarmViewModel.getAlarmList(this, LocaleConstant.PAGE_LIMIT, page); + alarmViewModel.getAlarmList(this, page); } @Override diff --git a/app/src/main/java/com/casic/dcms/view/pipeline/WarningOnMapActivity.java b/app/src/main/java/com/casic/dcms/view/pipeline/WarningOnMapActivity.java deleted file mode 100644 index 66a38d0..0000000 --- a/app/src/main/java/com/casic/dcms/view/pipeline/WarningOnMapActivity.java +++ /dev/null @@ -1,230 +0,0 @@ -package com.casic.dcms.view.pipeline; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.content.DialogInterface; -import android.graphics.Color; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.widget.TextView; - -import androidx.annotation.Nullable; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProvider; - -import com.casic.dcms.R; -import com.casic.dcms.databinding.ActivityMapWarningBinding; -import com.casic.dcms.model.WellAlarmListBean; -import com.casic.dcms.model.WellDetailBean; -import com.casic.dcms.utils.ArcGisMapCreator; -import com.casic.dcms.utils.LocaleConstant; -import com.casic.dcms.utils.ViewGroupKit; -import com.casic.dcms.vm.AlarmViewModel; -import com.casic.dcms.vm.WellViewModel; -import com.esri.arcgisruntime.geometry.Point; -import com.esri.arcgisruntime.mapping.ArcGISMap; -import com.esri.arcgisruntime.mapping.Basemap; -import com.esri.arcgisruntime.mapping.BasemapStyle; -import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; -import com.esri.arcgisruntime.mapping.view.Graphic; -import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; -import com.esri.arcgisruntime.symbology.SimpleMarkerSymbol; -import com.esri.arcgisruntime.util.ListenableList; -import com.pengxh.androidx.lite.base.AndroidxBaseActivity; -import com.pengxh.androidx.lite.utils.LoadState; -import com.pengxh.androidx.lite.utils.LoadingDialog; -import com.pengxh.androidx.lite.utils.SaveKeyValues; -import com.pengxh.androidx.lite.widget.TitleBarView; -import com.qmuiteam.qmui.util.QMUIDisplayHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; -import com.qmuiteam.qmui.widget.popup.QMUIPopup; -import com.qmuiteam.qmui.widget.popup.QMUIPopups; - -import java.util.ArrayList; -import java.util.List; - -public class WarningOnMapActivity extends AndroidxBaseActivity { - - private static final String TAG = "WarningOnMapActivity"; - private final Context context = this; - private final List geometryList = new ArrayList<>(); - private AlarmViewModel alarmViewModel; - private WellViewModel wellViewModel; - - @Override - protected void setupTopBarLayout() { - ViewGroupKit.initImmersionBar(binding.rootView, this, true, R.color.white); - binding.titleView.setOnClickListener(new TitleBarView.OnClickListener() { - @Override - public void onLeftClick() { - finish(); - } - - @Override - public void onRightClick() { - - } - }); - } - - @Override - protected void observeRequestState() { - alarmViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - if (loadState == LoadState.Loading) { - LoadingDialog.show(WarningOnMapActivity.this, "数据加载中,请稍后"); - } else { - LoadingDialog.dismiss(); - } - } - }); - - wellViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - - } - }); - } - - @Override - public void initOnCreate(@Nullable Bundle savedInstanceState) { - binding.mapView.setAttributionTextVisible(false);//去掉左下角属性标识 - binding.mapView.setViewpointScaleAsync(64000); - ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_STREETS); - //创建底图、并设置底图图层 - Basemap basemap = new Basemap(ArcGisMapCreator.createNoGridLayer()); - arcGISMap.setBasemap(basemap); - binding.mapView.setMap(arcGISMap); - - int alarmTotal = (int) SaveKeyValues.getValue("alarmTotal", LocaleConstant.PAGE_LIMIT); - alarmViewModel = new ViewModelProvider(this).get(AlarmViewModel.class); - alarmViewModel.wellAlarmListResult.observe(this, new Observer() { - @Override - public void onChanged(WellAlarmListBean alarmDataBean) { - if (alarmDataBean.getCode() == 200) { - List dataRows = alarmDataBean.getData().getRows(); - for (WellAlarmListBean.DataBean.RowsBean rowsBean : dataRows) { - String queryParam = "编号='" + rowsBean.getWellCode() + "'"; - wellViewModel.getWellDetail(context, queryParam); - } - } - } - }); - alarmViewModel.getAlarmList(this, alarmTotal, 1); - - wellViewModel = new ViewModelProvider(this).get(WellViewModel.class); - wellViewModel.resultModel.observe(this, new Observer() { - @Override - public void onChanged(WellDetailBean wellDetailBean) { - List features = wellDetailBean.getFeatures(); - if (features.size() > 0) { - WellDetailBean.FeaturesBean featuresBean = features.get(0); - //将获取到的井数据缓存起来 - geometryList.add(featuresBean); - WellDetailBean.FeaturesBean.GeometryBean geometryBean = featuresBean.getGeometry(); - //每获取一个点就绘制出 - addMarker(new Point(geometryBean.getX(), geometryBean.getY())); - } - } - }); - } - - @SuppressLint("ClickableViewAccessibility") - @Override - public void initEvent() { - binding.expandMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 0.5); - } - }); - binding.minusMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 2); - } - }); - - binding.mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, binding.mapView) { - @Override - public boolean onSingleTapConfirmed(MotionEvent e) { - android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); - Point clickPoint = binding.mapView.screenToLocation(screenPoint); - if (geometryList.size() > 0) { - List tempList = new ArrayList<>(); - for (WellDetailBean.FeaturesBean featuresBean : geometryList) { - WellDetailBean.FeaturesBean.GeometryBean dataBean = featuresBean.getGeometry(); - if (Math.abs(dataBean.getX() - clickPoint.getX()) <= 10 * LocaleConstant.DELTA_LNG_10 && - Math.abs(dataBean.getY() - clickPoint.getY()) <= 10 * LocaleConstant.DELTA_LNG_10) { - tempList.add(featuresBean); - } - } - if (tempList.size() > 0) { - QMUIDialog.MenuDialogBuilder menuDialogBuilder = new QMUIDialog.MenuDialogBuilder(context); - menuDialogBuilder.setTitle("请选择您要查看的窨井"); - for (WellDetailBean.FeaturesBean dataBean : tempList) { - menuDialogBuilder.addItem(dataBean.getAttributes().get编号(), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - - View popupView = LayoutInflater.from(context).inflate(R.layout.popu_well, null); - TextView wellCodeView = popupView.findViewById(R.id.wellCodeView); - TextView wellTypeView = popupView.findViewById(R.id.wellTypeView); - TextView wellPositionView = popupView.findViewById(R.id.wellPositionView); - - WellDetailBean.FeaturesBean.AttributesBean attributes = dataBean.getAttributes(); - wellCodeView.setText(attributes.get编号()); - wellTypeView.setText(attributes.get附属物名称()); - wellPositionView.setText(attributes.get所属道路()); - - QMUIPopups.popup(context, QMUIDisplayHelper.dp2px(context, 290)) - .preferredDirection(QMUIPopup.DIRECTION_BOTTOM) - .view(popupView) - .edgeProtection(QMUIDisplayHelper.dp2px(context, 20)) - .dimAmount(0.6f) - .animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER) - .onDismiss(null) - .show(binding.mapView); - } - }); - } - menuDialogBuilder.create().show(); - } - } - return super.onSingleTapConfirmed(e); - } - }); - } - - protected void onResume() { - super.onResume(); - binding.mapView.resume(); - } - - @Override - protected void onPause() { - super.onPause(); - binding.mapView.pause(); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - binding.mapView.dispose(); - } - - private void addMarker(Point point) { - SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.RED, 10); - Graphic graphic = new Graphic(point, simpleMarkerSymbol); - GraphicsOverlay mGraphicsOverlay = new GraphicsOverlay(); - ListenableList overlayGraphics = mGraphicsOverlay.getGraphics(); - ListenableList graphicsOverlays = binding.mapView.getGraphicsOverlays(); - overlayGraphics.add(graphic); - graphicsOverlays.add(mGraphicsOverlay); - } -} diff --git a/app/src/main/java/com/casic/dcms/vm/AlarmViewModel.java b/app/src/main/java/com/casic/dcms/vm/AlarmViewModel.java index 1e5dabd..e08affa 100644 --- a/app/src/main/java/com/casic/dcms/vm/AlarmViewModel.java +++ b/app/src/main/java/com/casic/dcms/vm/AlarmViewModel.java @@ -25,9 +25,9 @@ public MutableLiveData wellAlarmListResult = new MutableLiveData<>(); public MutableLiveData cancelActionModel = new MutableLiveData<>(); - public void getAlarmList(Context context, int limit, int offset) { + public void getAlarmList(Context context, int offset) { loadState.setValue(LoadState.Loading); - Observable alarmListObservable = RetrofitServiceManager.getAlarmList(limit, offset); + Observable alarmListObservable = RetrofitServiceManager.getAlarmList(offset); ObserverSubscriber.addSubscribe(alarmListObservable, new ObserverSubscriber.OnObserverCallback() { @Override public void onCompleted() { diff --git a/app/src/main/res/layout/activity_map_alarm.xml b/app/src/main/res/layout/activity_map_alarm.xml new file mode 100644 index 0000000..4887af9 --- /dev/null +++ b/app/src/main/res/layout/activity_map_alarm.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/.gitignore b/.gitignore index f0f71e2..ee6b213 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,12 @@ *.iml .gradle /local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml +/.idea .DS_Store /build /captures .externalNativeBuild .cxx .idea +*.apk +*.json diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fdb7255..6873489 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -109,7 +109,7 @@ - + diff --git a/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java b/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java index 2dcdc64..0364fc7 100644 --- a/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java +++ b/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java @@ -9,6 +9,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; @@ -25,7 +26,6 @@ private final Context context; private final List dataRows; private final LayoutInflater layoutInflater; - private PunishTypeAdapter adapter; public PackageCaseListAdapter(Context context, List dataRows) { this.context = context; @@ -36,7 +36,7 @@ @NonNull @Override public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new ItemViewHolder(layoutInflater.inflate(R.layout.item_package_rv, parent, false)); + return new ItemViewHolder(layoutInflater.inflate(R.layout.item_package_rv_l, parent, false)); } @Override @@ -57,16 +57,67 @@ return dataRows.size(); } - @SuppressLint("NotifyDataSetChanged") - public void refresh(List dataRows) { - this.dataRows.clear(); - this.dataRows.addAll(dataRows); - notifyDataSetChanged(); + public void refresh(List newRows) { + DiffUtil.Callback diffCallback = new DiffUtil.Callback() { + + @Override + public int getOldListSize() { + return dataRows.size(); + } + + @Override + public int getNewListSize() { + return newRows.size(); + } + + @Override + public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { + if (dataRows == null || newRows == null) { + return false; + } + + // 检查索引是否在有效范围内 + if (oldItemPosition < 0 || oldItemPosition >= dataRows.size() || + newItemPosition < 0 || newItemPosition >= newRows.size()) { + return false; + } + + // 获取元素并进行比较 + Object oldItem = dataRows.get(oldItemPosition); + Object newItem = newRows.get(newItemPosition); + + // 处理空指针情况 + if (oldItem == null && newItem == null) { + return true; + } + if (oldItem == null || newItem == null) { + return false; + } + + return oldItem.equals(newItem); + } + + @Override + public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { + return dataRows.get(oldItemPosition) == newRows.get(newItemPosition); + } + }; + + DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallback); + + dataRows.clear(); + dataRows.addAll(newRows); + + diffResult.dispatchUpdatesTo(this); } - public void loadMore(List dataRows) { - this.dataRows.addAll(dataRows); - notifyItemRangeInserted(this.dataRows.size(), dataRows.size()); + public void loadMore(List newRows) { + if (newRows.isEmpty()) { + return; + } + int startPosition = this.dataRows.size(); + this.dataRows.addAll(newRows); + notifyItemRangeInserted(startPosition, newRows.size()); } class ItemViewHolder extends RecyclerView.ViewHolder { @@ -84,7 +135,6 @@ casePunishView = itemView.findViewById(R.id.casePunishView); } - void bindView(PackageCaseBean.DataBean.RowsBean rowsBean) { //三包核实图片 String fileIdVerify = rowsBean.getFileIdVerify(); @@ -97,45 +147,6 @@ } caseTitleView.setText(rowsBean.getDescription()); caseDateView.setText("上报时间:" + rowsBean.getReportTime()); -// HttpRequestHelper.doRequest(LocaleConstant.SHOP_PUNISH_LIST, rowsBean.getShopId(), new IHttpRequestListener() { -// @Override -// public void onSuccess(ResponseBody resultBean) { -// try { -// PunishTypeBean punishTypeBean = gson.fromJson(resultBean.string(), PunishTypeBean.class); -// if (punishTypeBean.getData().size() != 0) { -// //获取商铺处罚次数 -// HttpRequestHelper.doRequest(LocaleConstant.SHOP_PUNISH_TYPE, rowsBean.getShopId(), new IHttpRequestListener() { -// @Override -// public void onSuccess(ResponseBody resultBean) { -// try { -// PunishTimesBean punishTimesBean = gson.fromJson(resultBean.string(), PunishTimesBean.class); -// -// adapter = new PunishTypeAdapter(context, punishTypeBean.getData(), punishTimesBean.getData()); -// LinearLayoutManager layoutManager = new LinearLayoutManager(context); -// layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); -// punishRecyclerView.setLayoutManager(layoutManager); -// punishRecyclerView.setAdapter(adapter); -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } -// -// @Override -// public void onFailure(Throwable throwable) { -// -// } -// }); -// } -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } -// -// @Override -// public void onFailure(Throwable throwable) { -// -// } -// }); } } diff --git a/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java b/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java deleted file mode 100644 index 2e178e5..0000000 --- a/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.casic.dcms.adapter; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.core.content.ContextCompat; -import androidx.recyclerview.widget.RecyclerView; - -import com.casic.dcms.R; -import com.casic.dcms.model.PunishTimesBean; -import com.casic.dcms.model.PunishTypeBean; - -import java.util.List; - -@SuppressLint("SetTextI18n") -public class PunishTypeAdapter extends RecyclerView.Adapter { - - private final Context context; - private final List dataRows; - private final PunishTimesBean.DataBean dataBean; - private final LayoutInflater layoutInflater; - - PunishTypeAdapter(Context context, List dataRows, PunishTimesBean.DataBean dataBean) { - this.context = context; - this.dataRows = dataRows; - this.dataBean = dataBean; - this.layoutInflater = LayoutInflater.from(context); - } - - @NonNull - @Override - public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new ItemViewHolder(layoutInflater.inflate(R.layout.item_punish_recycleview, parent, false)); - } - - @Override - public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { - String typeName = dataRows.get(position).getPunishTypeName(); - int color, times; - switch (typeName) { - case "劝导": - times = dataBean.getPersuade(); - color = ContextCompat.getColor(context, R.color.persuadeColor); - break; - case "警告": - times = dataBean.getWarn(); - color = ContextCompat.getColor(context, R.color.warnColor); - break; - case "处罚": - times = dataBean.getPunish(); - color = ContextCompat.getColor(context, R.color.punishColor); - break; - default: - times = 0; - color = ContextCompat.getColor(context, R.color.mainThemeColor); - break; - } - if (times == 0) { - holder.punishTypeView.setVisibility(View.GONE); - } else { - holder.punishTypeView.setText(typeName + " x " + times); - holder.punishTypeView.setBackgroundColor(color); - } - } - - @Override - public int getItemCount() { - return dataRows.size(); - } - - static class ItemViewHolder extends RecyclerView.ViewHolder { - - private final TextView punishTypeView; - - ItemViewHolder(@NonNull View itemView) { - super(itemView); - punishTypeView = itemView.findViewById(R.id.punishTypeView); - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java b/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java deleted file mode 100644 index dc57ca3..0000000 --- a/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.dcms.model; - -public class PunishTimesBean { - 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 { - /** - * warn : 0 - * punish : 0 - * persuade : 0 - */ - - private int warn; - private int punish; - private int persuade; - - public int getWarn() { - return warn; - } - - public void setWarn(int warn) { - this.warn = warn; - } - - public int getPunish() { - return punish; - } - - public void setPunish(int punish) { - this.punish = punish; - } - - public int getPersuade() { - return persuade; - } - - public void setPersuade(int persuade) { - this.persuade = persuade; - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java b/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java deleted file mode 100644 index 00b6a98..0000000 --- a/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.casic.dcms.model; - -import java.util.List; - -public class PunishTypeBean { - private int code; - private String message; - private boolean success; - private List data; - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - 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 List getData() { - return data; - } - - public void setData(List data) { - this.data = data; - } - - public static class DataBean { - /** - * punishTime : 2021-01-12 09:08:59 - * punishTypeName : 处罚 - * punishImage : images - * punishType : 1 - * punishRemarks : 处罚 - */ - - private String punishTime; - private String punishTypeName; - private String punishImage; - private String punishType; - private String punishRemarks; - - public String getPunishTime() { - return punishTime; - } - - public void setPunishTime(String punishTime) { - this.punishTime = punishTime; - } - - public String getPunishTypeName() { - return punishTypeName; - } - - public void setPunishTypeName(String punishTypeName) { - this.punishTypeName = punishTypeName; - } - - public String getPunishImage() { - return punishImage; - } - - public void setPunishImage(String punishImage) { - this.punishImage = punishImage; - } - - public String getPunishType() { - return punishType; - } - - public void setPunishType(String punishType) { - this.punishType = punishType; - } - - public String getPunishRemarks() { - return punishRemarks; - } - - public void setPunishRemarks(String punishRemarks) { - this.punishRemarks = punishRemarks; - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/UnitFeatureBean.java b/app/src/main/java/com/casic/dcms/model/UnitFeatureBean.java deleted file mode 100644 index a4d8337..0000000 --- a/app/src/main/java/com/casic/dcms/model/UnitFeatureBean.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.casic.dcms.model; - -public class UnitFeatureBean { - - private String BGID; - private String BGNAME; - private int OBJECTID; - - public String getBGID() { - return BGID; - } - - public void setBGID(String BGID) { - this.BGID = BGID; - } - - public String getBGNAME() { - return BGNAME; - } - - public void setBGNAME(String BGNAME) { - this.BGNAME = BGNAME; - } - - public int getOBJECTID() { - return OBJECTID; - } - - public void setOBJECTID(int OBJECTID) { - this.OBJECTID = OBJECTID; - } -} diff --git a/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java b/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java index 0578f7b..b0c24d5 100644 --- a/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java +++ b/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java @@ -1,9 +1,16 @@ package com.casic.dcms.model; +import android.os.Parcel; +import android.os.Parcelable; + +import androidx.annotation.NonNull; + import java.util.List; -public class WellAlarmListBean { - +/** + * Parcelable 是 Android 平台专门为性能优化而设计的序列化机制,通常比 Serializable 快 10 倍左右 + */ +public class WellAlarmListBean implements Parcelable { private int code; private DataBean data; private String message; @@ -41,7 +48,43 @@ this.success = success; } - public static class DataBean { + public WellAlarmListBean() { + + } + + protected WellAlarmListBean(Parcel in) { + code = in.readInt(); + data = in.readParcelable(DataBean.class.getClassLoader()); + message = in.readString(); + success = in.readByte() != 0; + } + + public static final Creator CREATOR = new Creator() { + @Override + public WellAlarmListBean createFromParcel(Parcel in) { + return new WellAlarmListBean(in); + } + + @Override + public WellAlarmListBean[] newArray(int size) { + return new WellAlarmListBean[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + dest.writeInt(code); + dest.writeParcelable(data, flags); + dest.writeString(message); + dest.writeByte((byte) (success ? 1 : 0)); + } + + public static class DataBean implements Parcelable { private int total; private List rows; @@ -62,7 +105,38 @@ this.rows = rows; } - public static class RowsBean { + public DataBean() { + } + + protected DataBean(Parcel in) { + total = in.readInt(); + rows = in.createTypedArrayList(RowsBean.CREATOR); + } + + public static final Creator CREATOR = new Creator() { + @Override + public DataBean createFromParcel(Parcel in) { + return new DataBean(in); + } + + @Override + public DataBean[] newArray(int size) { + return new DataBean[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(total); + dest.writeTypedList(rows); + } + + public static class RowsBean implements Parcelable { /** * alarmContent : 1 * deptName : 崇仁县城管局 @@ -296,6 +370,79 @@ public void setStatus(String status) { this.status = status; } + + public RowsBean() { + } + + protected RowsBean(Parcel in) { + alarmContent = in.readInt(); + deptName = in.readString(); + jobStatus = in.readString(); + alarmContentName = in.readString(); + wellCode = in.readString(); + alarmTime = in.readString(); + deptid = in.readString(); + alarmTypeName = in.readString(); + alarmMessage = in.readString(); + staff = in.readString(); + deviceId = in.readString(); + jobId = in.readString(); + jobStatusName = in.readString(); + alarmType = in.readString(); + alarmValue = in.readString(); + devcode = in.readString(); + statusName = in.readString(); + alarmLevel = in.readString(); + tel = in.readString(); + id = in.readString(); + wellId = in.readString(); + position = in.readString(); + status = in.readString(); + } + + public static final Creator CREATOR = new Creator() { + @Override + public RowsBean createFromParcel(Parcel in) { + return new RowsBean(in); + } + + @Override + public RowsBean[] newArray(int size) { + return new RowsBean[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(alarmContent); + dest.writeString(deptName); + dest.writeString(jobStatus); + dest.writeString(alarmContentName); + dest.writeString(wellCode); + dest.writeString(alarmTime); + dest.writeString(deptid); + dest.writeString(alarmTypeName); + dest.writeString(alarmMessage); + dest.writeString(staff); + dest.writeString(deviceId); + dest.writeString(jobId); + dest.writeString(jobStatusName); + dest.writeString(alarmType); + dest.writeString(alarmValue); + dest.writeString(devcode); + dest.writeString(statusName); + dest.writeString(alarmLevel); + dest.writeString(tel); + dest.writeString(id); + dest.writeString(wellId); + dest.writeString(position); + dest.writeString(status); + } } } } diff --git a/app/src/main/java/com/casic/dcms/model/WellDetailBean.java b/app/src/main/java/com/casic/dcms/model/WellDetailBean.java index cea8774..4e6c8fd 100644 --- a/app/src/main/java/com/casic/dcms/model/WellDetailBean.java +++ b/app/src/main/java/com/casic/dcms/model/WellDetailBean.java @@ -60,7 +60,6 @@ } public static class FieldAliasesBean { - private String objectid; private String 编号; private String 附属物编码; @@ -190,7 +189,6 @@ } public static class SpatialReferenceBean { - private int wkid; private int latestWkid; @@ -212,7 +210,6 @@ } public static class FieldsBean { - private String name; private String type; private String alias; @@ -252,7 +249,6 @@ } public static class FeaturesBean { - private AttributesBean attributes; private GeometryBean geometry; diff --git a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java index 8b15d77..6f1d941 100644 --- a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java @@ -621,8 +621,8 @@ /** * 报警列表 */ - public static Observable getAlarmList(int limit, int offset) { - return api.getAlarmList(AuthenticationHelper.getToken(), "1", limit, offset); + public static Observable getAlarmList(int offset) { + return api.getAlarmList(AuthenticationHelper.getToken(), "1", LocaleConstant.PAGE_LIMIT, offset); } /** @@ -662,18 +662,15 @@ return api.optionWellStatus(AuthenticationHelper.getToken(), bfzt); } + private static final RetrofitService arcgisApi = RetrofitFactory.createRetrofit( + "http://111.198.10.15:13002", RetrofitService.class, true + ); + /** * 报警窨井详情 */ public static Observable getWellDetailResult(String where) { -// Retrofit retrofit = new Retrofit.Builder() -// .baseUrl("http://111.198.10.15:13002") -// .addConverterFactory(GsonConverterFactory.create())//Gson转换器 -// .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) -// .client(createOKHttpClient())//log拦截器 -// .build(); -// RetrofitService service = retrofit.create(RetrofitService.class); - return api.getWellDetail( + return arcgisApi.getWellDetail( "json", "4326", "4326", "*", true, where ); } diff --git a/app/src/main/java/com/casic/dcms/view/pipeline/AlarmOnMapActivity.java b/app/src/main/java/com/casic/dcms/view/pipeline/AlarmOnMapActivity.java new file mode 100644 index 0000000..e3dc01d --- /dev/null +++ b/app/src/main/java/com/casic/dcms/view/pipeline/AlarmOnMapActivity.java @@ -0,0 +1,212 @@ +package com.casic.dcms.view.pipeline; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.DialogInterface; +import android.graphics.Color; +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; + +import com.casic.dcms.R; +import com.casic.dcms.databinding.ActivityMapAlarmBinding; +import com.casic.dcms.model.WellAlarmListBean; +import com.casic.dcms.model.WellDetailBean; +import com.casic.dcms.utils.ArcGisMapCreator; +import com.casic.dcms.utils.LocaleConstant; +import com.casic.dcms.utils.ViewGroupKit; +import com.casic.dcms.vm.WellViewModel; +import com.esri.arcgisruntime.geometry.Point; +import com.esri.arcgisruntime.mapping.ArcGISMap; +import com.esri.arcgisruntime.mapping.Basemap; +import com.esri.arcgisruntime.mapping.BasemapStyle; +import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; +import com.esri.arcgisruntime.mapping.view.Graphic; +import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; +import com.esri.arcgisruntime.symbology.SimpleMarkerSymbol; +import com.esri.arcgisruntime.util.ListenableList; +import com.pengxh.androidx.lite.base.AndroidxBaseActivity; +import com.pengxh.androidx.lite.utils.LoadState; +import com.pengxh.androidx.lite.utils.LoadingDialog; +import com.pengxh.androidx.lite.widget.TitleBarView; +import com.qmuiteam.qmui.util.QMUIDisplayHelper; +import com.qmuiteam.qmui.widget.dialog.QMUIDialog; +import com.qmuiteam.qmui.widget.popup.QMUIPopup; +import com.qmuiteam.qmui.widget.popup.QMUIPopups; + +import java.util.ArrayList; +import java.util.List; + +public class AlarmOnMapActivity extends AndroidxBaseActivity { + + private static final String TAG = "AlarmOnMapActivity"; + private final Context context = this; + private final List geometryList = new ArrayList<>(); + private WellViewModel wellViewModel; + + @Override + protected void setupTopBarLayout() { + ViewGroupKit.initImmersionBar(binding.rootView, this, true, R.color.white); + binding.titleView.setOnClickListener(new TitleBarView.OnClickListener() { + @Override + public void onLeftClick() { + finish(); + } + + @Override + public void onRightClick() { + + } + }); + } + + @Override + protected void observeRequestState() { + wellViewModel.loadState.observe(this, new Observer() { + @Override + public void onChanged(LoadState loadState) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(AlarmOnMapActivity.this, "数据加载中,请稍后"); + } else { + LoadingDialog.dismiss(); + } + } + }); + } + + @Override + public void initOnCreate(@Nullable Bundle savedInstanceState) { + binding.mapView.setAttributionTextVisible(false);//去掉左下角属性标识 + binding.mapView.setViewpointScaleAsync(64000); + ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_STREETS); + //创建底图、并设置底图图层 + Basemap basemap = new Basemap(ArcGisMapCreator.createNoGridLayer()); + arcGISMap.setBasemap(basemap); + binding.mapView.setMap(arcGISMap); + + wellViewModel = new ViewModelProvider(this).get(WellViewModel.class); + wellViewModel.resultModel.observe(this, new Observer() { + @Override + public void onChanged(WellDetailBean wellDetailBean) { + List features = wellDetailBean.getFeatures(); + if (features.size() > 0) { + WellDetailBean.FeaturesBean featuresBean = features.get(0); + //将获取到的井数据缓存起来 + geometryList.add(featuresBean); + WellDetailBean.FeaturesBean.GeometryBean geometryBean = featuresBean.getGeometry(); + //每获取一个点就绘制出 + addMarker(new Point(geometryBean.getX(), geometryBean.getY())); + } + } + }); + + Bundle extras = getIntent().getExtras(); + if (extras != null) { + List dataBeans = extras.getParcelableArrayList("rows_list"); + if (dataBeans == null) { + return; + } + for (WellAlarmListBean.DataBean.RowsBean dataBean : dataBeans) { + String queryParam = "编号='" + dataBean.getWellCode() + "'"; + Log.d(TAG, "queryParam: " + queryParam); + wellViewModel.getWellDetail(context, queryParam); + } + } + } + + @SuppressLint("ClickableViewAccessibility") + @Override + public void initEvent() { + binding.expandMapView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 0.5); + } + }); + binding.minusMapView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 2); + } + }); + + binding.mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, binding.mapView) { + @Override + public boolean onSingleTapConfirmed(MotionEvent e) { + android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); + Point clickPoint = binding.mapView.screenToLocation(screenPoint); + if (geometryList.size() > 0) { + List tempList = new ArrayList<>(); + for (WellDetailBean.FeaturesBean featuresBean : geometryList) { + WellDetailBean.FeaturesBean.GeometryBean dataBean = featuresBean.getGeometry(); + if (Math.abs(dataBean.getX() - clickPoint.getX()) <= 10 * LocaleConstant.DELTA_LNG_10 && + Math.abs(dataBean.getY() - clickPoint.getY()) <= 10 * LocaleConstant.DELTA_LNG_10) { + tempList.add(featuresBean); + } + } + if (tempList.size() > 0) { + QMUIDialog.MenuDialogBuilder menuDialogBuilder = new QMUIDialog.MenuDialogBuilder(context); + menuDialogBuilder.setTitle("请选择您要查看的窨井"); + for (WellDetailBean.FeaturesBean dataBean : tempList) { + menuDialogBuilder.addItem(dataBean.getAttributes().get编号(), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + + View popupView = LayoutInflater.from(context).inflate(R.layout.popu_well, null); + TextView wellCodeView = popupView.findViewById(R.id.wellCodeView); + TextView wellTypeView = popupView.findViewById(R.id.wellTypeView); + TextView wellPositionView = popupView.findViewById(R.id.wellPositionView); + + WellDetailBean.FeaturesBean.AttributesBean attributes = dataBean.getAttributes(); + wellCodeView.setText(attributes.get编号()); + wellTypeView.setText(attributes.get附属物名称()); + wellPositionView.setText(attributes.get所属道路()); + + QMUIPopups.popup(context, QMUIDisplayHelper.dp2px(context, 290)) + .preferredDirection(QMUIPopup.DIRECTION_BOTTOM) + .view(popupView) + .edgeProtection(QMUIDisplayHelper.dp2px(context, 20)) + .dimAmount(0.6f) + .animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER) + .onDismiss(null) + .show(binding.mapView); + } + }); + } + menuDialogBuilder.create().show(); + } + } + return super.onSingleTapConfirmed(e); + } + }); + } + + protected void onResume() { + super.onResume(); + binding.mapView.resume(); + } + + @Override + protected void onPause() { + super.onPause(); + binding.mapView.pause(); + } + + private void addMarker(Point point) { + SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.RED, 10); + Graphic graphic = new Graphic(point, simpleMarkerSymbol); + GraphicsOverlay mGraphicsOverlay = new GraphicsOverlay(); + ListenableList overlayGraphics = mGraphicsOverlay.getGraphics(); + ListenableList graphicsOverlays = binding.mapView.getGraphicsOverlays(); + overlayGraphics.add(graphic); + graphicsOverlays.add(mGraphicsOverlay); + } +} diff --git a/app/src/main/java/com/casic/dcms/view/pipeline/PipelineManagerActivity.java b/app/src/main/java/com/casic/dcms/view/pipeline/PipelineManagerActivity.java index e2e6656..eac37ed 100644 --- a/app/src/main/java/com/casic/dcms/view/pipeline/PipelineManagerActivity.java +++ b/app/src/main/java/com/casic/dcms/view/pipeline/PipelineManagerActivity.java @@ -1,6 +1,7 @@ package com.casic.dcms.view.pipeline; import android.content.Context; +import android.content.Intent; import android.graphics.Color; import android.os.Bundle; import android.os.Handler; @@ -75,7 +76,13 @@ showBatchCancelDialog(); break; case 1: - ContextKit.navigatePageTo(context, WarningOnMapActivity.class); + if (dataBeans.isEmpty()) { + StringKit.show(context, "无报警数据"); + return; + } + Intent intent = new Intent(context, AlarmOnMapActivity.class); + intent.putParcelableArrayListExtra("rows_list", new ArrayList<>(dataBeans)); + context.startActivity(intent); break; case 2: ContextKit.navigatePageTo(context, WellListActivity.class); @@ -153,7 +160,7 @@ } private void getAlarmList() { - alarmViewModel.getAlarmList(this, LocaleConstant.PAGE_LIMIT, page); + alarmViewModel.getAlarmList(this, page); } @Override diff --git a/app/src/main/java/com/casic/dcms/view/pipeline/WarningOnMapActivity.java b/app/src/main/java/com/casic/dcms/view/pipeline/WarningOnMapActivity.java deleted file mode 100644 index 66a38d0..0000000 --- a/app/src/main/java/com/casic/dcms/view/pipeline/WarningOnMapActivity.java +++ /dev/null @@ -1,230 +0,0 @@ -package com.casic.dcms.view.pipeline; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.content.DialogInterface; -import android.graphics.Color; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.widget.TextView; - -import androidx.annotation.Nullable; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProvider; - -import com.casic.dcms.R; -import com.casic.dcms.databinding.ActivityMapWarningBinding; -import com.casic.dcms.model.WellAlarmListBean; -import com.casic.dcms.model.WellDetailBean; -import com.casic.dcms.utils.ArcGisMapCreator; -import com.casic.dcms.utils.LocaleConstant; -import com.casic.dcms.utils.ViewGroupKit; -import com.casic.dcms.vm.AlarmViewModel; -import com.casic.dcms.vm.WellViewModel; -import com.esri.arcgisruntime.geometry.Point; -import com.esri.arcgisruntime.mapping.ArcGISMap; -import com.esri.arcgisruntime.mapping.Basemap; -import com.esri.arcgisruntime.mapping.BasemapStyle; -import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; -import com.esri.arcgisruntime.mapping.view.Graphic; -import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; -import com.esri.arcgisruntime.symbology.SimpleMarkerSymbol; -import com.esri.arcgisruntime.util.ListenableList; -import com.pengxh.androidx.lite.base.AndroidxBaseActivity; -import com.pengxh.androidx.lite.utils.LoadState; -import com.pengxh.androidx.lite.utils.LoadingDialog; -import com.pengxh.androidx.lite.utils.SaveKeyValues; -import com.pengxh.androidx.lite.widget.TitleBarView; -import com.qmuiteam.qmui.util.QMUIDisplayHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; -import com.qmuiteam.qmui.widget.popup.QMUIPopup; -import com.qmuiteam.qmui.widget.popup.QMUIPopups; - -import java.util.ArrayList; -import java.util.List; - -public class WarningOnMapActivity extends AndroidxBaseActivity { - - private static final String TAG = "WarningOnMapActivity"; - private final Context context = this; - private final List geometryList = new ArrayList<>(); - private AlarmViewModel alarmViewModel; - private WellViewModel wellViewModel; - - @Override - protected void setupTopBarLayout() { - ViewGroupKit.initImmersionBar(binding.rootView, this, true, R.color.white); - binding.titleView.setOnClickListener(new TitleBarView.OnClickListener() { - @Override - public void onLeftClick() { - finish(); - } - - @Override - public void onRightClick() { - - } - }); - } - - @Override - protected void observeRequestState() { - alarmViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - if (loadState == LoadState.Loading) { - LoadingDialog.show(WarningOnMapActivity.this, "数据加载中,请稍后"); - } else { - LoadingDialog.dismiss(); - } - } - }); - - wellViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - - } - }); - } - - @Override - public void initOnCreate(@Nullable Bundle savedInstanceState) { - binding.mapView.setAttributionTextVisible(false);//去掉左下角属性标识 - binding.mapView.setViewpointScaleAsync(64000); - ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_STREETS); - //创建底图、并设置底图图层 - Basemap basemap = new Basemap(ArcGisMapCreator.createNoGridLayer()); - arcGISMap.setBasemap(basemap); - binding.mapView.setMap(arcGISMap); - - int alarmTotal = (int) SaveKeyValues.getValue("alarmTotal", LocaleConstant.PAGE_LIMIT); - alarmViewModel = new ViewModelProvider(this).get(AlarmViewModel.class); - alarmViewModel.wellAlarmListResult.observe(this, new Observer() { - @Override - public void onChanged(WellAlarmListBean alarmDataBean) { - if (alarmDataBean.getCode() == 200) { - List dataRows = alarmDataBean.getData().getRows(); - for (WellAlarmListBean.DataBean.RowsBean rowsBean : dataRows) { - String queryParam = "编号='" + rowsBean.getWellCode() + "'"; - wellViewModel.getWellDetail(context, queryParam); - } - } - } - }); - alarmViewModel.getAlarmList(this, alarmTotal, 1); - - wellViewModel = new ViewModelProvider(this).get(WellViewModel.class); - wellViewModel.resultModel.observe(this, new Observer() { - @Override - public void onChanged(WellDetailBean wellDetailBean) { - List features = wellDetailBean.getFeatures(); - if (features.size() > 0) { - WellDetailBean.FeaturesBean featuresBean = features.get(0); - //将获取到的井数据缓存起来 - geometryList.add(featuresBean); - WellDetailBean.FeaturesBean.GeometryBean geometryBean = featuresBean.getGeometry(); - //每获取一个点就绘制出 - addMarker(new Point(geometryBean.getX(), geometryBean.getY())); - } - } - }); - } - - @SuppressLint("ClickableViewAccessibility") - @Override - public void initEvent() { - binding.expandMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 0.5); - } - }); - binding.minusMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 2); - } - }); - - binding.mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, binding.mapView) { - @Override - public boolean onSingleTapConfirmed(MotionEvent e) { - android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); - Point clickPoint = binding.mapView.screenToLocation(screenPoint); - if (geometryList.size() > 0) { - List tempList = new ArrayList<>(); - for (WellDetailBean.FeaturesBean featuresBean : geometryList) { - WellDetailBean.FeaturesBean.GeometryBean dataBean = featuresBean.getGeometry(); - if (Math.abs(dataBean.getX() - clickPoint.getX()) <= 10 * LocaleConstant.DELTA_LNG_10 && - Math.abs(dataBean.getY() - clickPoint.getY()) <= 10 * LocaleConstant.DELTA_LNG_10) { - tempList.add(featuresBean); - } - } - if (tempList.size() > 0) { - QMUIDialog.MenuDialogBuilder menuDialogBuilder = new QMUIDialog.MenuDialogBuilder(context); - menuDialogBuilder.setTitle("请选择您要查看的窨井"); - for (WellDetailBean.FeaturesBean dataBean : tempList) { - menuDialogBuilder.addItem(dataBean.getAttributes().get编号(), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - - View popupView = LayoutInflater.from(context).inflate(R.layout.popu_well, null); - TextView wellCodeView = popupView.findViewById(R.id.wellCodeView); - TextView wellTypeView = popupView.findViewById(R.id.wellTypeView); - TextView wellPositionView = popupView.findViewById(R.id.wellPositionView); - - WellDetailBean.FeaturesBean.AttributesBean attributes = dataBean.getAttributes(); - wellCodeView.setText(attributes.get编号()); - wellTypeView.setText(attributes.get附属物名称()); - wellPositionView.setText(attributes.get所属道路()); - - QMUIPopups.popup(context, QMUIDisplayHelper.dp2px(context, 290)) - .preferredDirection(QMUIPopup.DIRECTION_BOTTOM) - .view(popupView) - .edgeProtection(QMUIDisplayHelper.dp2px(context, 20)) - .dimAmount(0.6f) - .animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER) - .onDismiss(null) - .show(binding.mapView); - } - }); - } - menuDialogBuilder.create().show(); - } - } - return super.onSingleTapConfirmed(e); - } - }); - } - - protected void onResume() { - super.onResume(); - binding.mapView.resume(); - } - - @Override - protected void onPause() { - super.onPause(); - binding.mapView.pause(); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - binding.mapView.dispose(); - } - - private void addMarker(Point point) { - SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.RED, 10); - Graphic graphic = new Graphic(point, simpleMarkerSymbol); - GraphicsOverlay mGraphicsOverlay = new GraphicsOverlay(); - ListenableList overlayGraphics = mGraphicsOverlay.getGraphics(); - ListenableList graphicsOverlays = binding.mapView.getGraphicsOverlays(); - overlayGraphics.add(graphic); - graphicsOverlays.add(mGraphicsOverlay); - } -} diff --git a/app/src/main/java/com/casic/dcms/vm/AlarmViewModel.java b/app/src/main/java/com/casic/dcms/vm/AlarmViewModel.java index 1e5dabd..e08affa 100644 --- a/app/src/main/java/com/casic/dcms/vm/AlarmViewModel.java +++ b/app/src/main/java/com/casic/dcms/vm/AlarmViewModel.java @@ -25,9 +25,9 @@ public MutableLiveData wellAlarmListResult = new MutableLiveData<>(); public MutableLiveData cancelActionModel = new MutableLiveData<>(); - public void getAlarmList(Context context, int limit, int offset) { + public void getAlarmList(Context context, int offset) { loadState.setValue(LoadState.Loading); - Observable alarmListObservable = RetrofitServiceManager.getAlarmList(limit, offset); + Observable alarmListObservable = RetrofitServiceManager.getAlarmList(offset); ObserverSubscriber.addSubscribe(alarmListObservable, new ObserverSubscriber.OnObserverCallback() { @Override public void onCompleted() { diff --git a/app/src/main/res/layout/activity_map_alarm.xml b/app/src/main/res/layout/activity_map_alarm.xml new file mode 100644 index 0000000..4887af9 --- /dev/null +++ b/app/src/main/res/layout/activity_map_alarm.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_map_warning.xml b/app/src/main/res/layout/activity_map_warning.xml deleted file mode 100644 index 4887af9..0000000 --- a/app/src/main/res/layout/activity_map_warning.xml +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/.gitignore b/.gitignore index f0f71e2..ee6b213 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,12 @@ *.iml .gradle /local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml +/.idea .DS_Store /build /captures .externalNativeBuild .cxx .idea +*.apk +*.json diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fdb7255..6873489 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -109,7 +109,7 @@ - + diff --git a/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java b/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java index 2dcdc64..0364fc7 100644 --- a/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java +++ b/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java @@ -9,6 +9,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; @@ -25,7 +26,6 @@ private final Context context; private final List dataRows; private final LayoutInflater layoutInflater; - private PunishTypeAdapter adapter; public PackageCaseListAdapter(Context context, List dataRows) { this.context = context; @@ -36,7 +36,7 @@ @NonNull @Override public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new ItemViewHolder(layoutInflater.inflate(R.layout.item_package_rv, parent, false)); + return new ItemViewHolder(layoutInflater.inflate(R.layout.item_package_rv_l, parent, false)); } @Override @@ -57,16 +57,67 @@ return dataRows.size(); } - @SuppressLint("NotifyDataSetChanged") - public void refresh(List dataRows) { - this.dataRows.clear(); - this.dataRows.addAll(dataRows); - notifyDataSetChanged(); + public void refresh(List newRows) { + DiffUtil.Callback diffCallback = new DiffUtil.Callback() { + + @Override + public int getOldListSize() { + return dataRows.size(); + } + + @Override + public int getNewListSize() { + return newRows.size(); + } + + @Override + public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { + if (dataRows == null || newRows == null) { + return false; + } + + // 检查索引是否在有效范围内 + if (oldItemPosition < 0 || oldItemPosition >= dataRows.size() || + newItemPosition < 0 || newItemPosition >= newRows.size()) { + return false; + } + + // 获取元素并进行比较 + Object oldItem = dataRows.get(oldItemPosition); + Object newItem = newRows.get(newItemPosition); + + // 处理空指针情况 + if (oldItem == null && newItem == null) { + return true; + } + if (oldItem == null || newItem == null) { + return false; + } + + return oldItem.equals(newItem); + } + + @Override + public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { + return dataRows.get(oldItemPosition) == newRows.get(newItemPosition); + } + }; + + DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallback); + + dataRows.clear(); + dataRows.addAll(newRows); + + diffResult.dispatchUpdatesTo(this); } - public void loadMore(List dataRows) { - this.dataRows.addAll(dataRows); - notifyItemRangeInserted(this.dataRows.size(), dataRows.size()); + public void loadMore(List newRows) { + if (newRows.isEmpty()) { + return; + } + int startPosition = this.dataRows.size(); + this.dataRows.addAll(newRows); + notifyItemRangeInserted(startPosition, newRows.size()); } class ItemViewHolder extends RecyclerView.ViewHolder { @@ -84,7 +135,6 @@ casePunishView = itemView.findViewById(R.id.casePunishView); } - void bindView(PackageCaseBean.DataBean.RowsBean rowsBean) { //三包核实图片 String fileIdVerify = rowsBean.getFileIdVerify(); @@ -97,45 +147,6 @@ } caseTitleView.setText(rowsBean.getDescription()); caseDateView.setText("上报时间:" + rowsBean.getReportTime()); -// HttpRequestHelper.doRequest(LocaleConstant.SHOP_PUNISH_LIST, rowsBean.getShopId(), new IHttpRequestListener() { -// @Override -// public void onSuccess(ResponseBody resultBean) { -// try { -// PunishTypeBean punishTypeBean = gson.fromJson(resultBean.string(), PunishTypeBean.class); -// if (punishTypeBean.getData().size() != 0) { -// //获取商铺处罚次数 -// HttpRequestHelper.doRequest(LocaleConstant.SHOP_PUNISH_TYPE, rowsBean.getShopId(), new IHttpRequestListener() { -// @Override -// public void onSuccess(ResponseBody resultBean) { -// try { -// PunishTimesBean punishTimesBean = gson.fromJson(resultBean.string(), PunishTimesBean.class); -// -// adapter = new PunishTypeAdapter(context, punishTypeBean.getData(), punishTimesBean.getData()); -// LinearLayoutManager layoutManager = new LinearLayoutManager(context); -// layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); -// punishRecyclerView.setLayoutManager(layoutManager); -// punishRecyclerView.setAdapter(adapter); -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } -// -// @Override -// public void onFailure(Throwable throwable) { -// -// } -// }); -// } -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } -// -// @Override -// public void onFailure(Throwable throwable) { -// -// } -// }); } } diff --git a/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java b/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java deleted file mode 100644 index 2e178e5..0000000 --- a/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.casic.dcms.adapter; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.core.content.ContextCompat; -import androidx.recyclerview.widget.RecyclerView; - -import com.casic.dcms.R; -import com.casic.dcms.model.PunishTimesBean; -import com.casic.dcms.model.PunishTypeBean; - -import java.util.List; - -@SuppressLint("SetTextI18n") -public class PunishTypeAdapter extends RecyclerView.Adapter { - - private final Context context; - private final List dataRows; - private final PunishTimesBean.DataBean dataBean; - private final LayoutInflater layoutInflater; - - PunishTypeAdapter(Context context, List dataRows, PunishTimesBean.DataBean dataBean) { - this.context = context; - this.dataRows = dataRows; - this.dataBean = dataBean; - this.layoutInflater = LayoutInflater.from(context); - } - - @NonNull - @Override - public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new ItemViewHolder(layoutInflater.inflate(R.layout.item_punish_recycleview, parent, false)); - } - - @Override - public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { - String typeName = dataRows.get(position).getPunishTypeName(); - int color, times; - switch (typeName) { - case "劝导": - times = dataBean.getPersuade(); - color = ContextCompat.getColor(context, R.color.persuadeColor); - break; - case "警告": - times = dataBean.getWarn(); - color = ContextCompat.getColor(context, R.color.warnColor); - break; - case "处罚": - times = dataBean.getPunish(); - color = ContextCompat.getColor(context, R.color.punishColor); - break; - default: - times = 0; - color = ContextCompat.getColor(context, R.color.mainThemeColor); - break; - } - if (times == 0) { - holder.punishTypeView.setVisibility(View.GONE); - } else { - holder.punishTypeView.setText(typeName + " x " + times); - holder.punishTypeView.setBackgroundColor(color); - } - } - - @Override - public int getItemCount() { - return dataRows.size(); - } - - static class ItemViewHolder extends RecyclerView.ViewHolder { - - private final TextView punishTypeView; - - ItemViewHolder(@NonNull View itemView) { - super(itemView); - punishTypeView = itemView.findViewById(R.id.punishTypeView); - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java b/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java deleted file mode 100644 index dc57ca3..0000000 --- a/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.dcms.model; - -public class PunishTimesBean { - 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 { - /** - * warn : 0 - * punish : 0 - * persuade : 0 - */ - - private int warn; - private int punish; - private int persuade; - - public int getWarn() { - return warn; - } - - public void setWarn(int warn) { - this.warn = warn; - } - - public int getPunish() { - return punish; - } - - public void setPunish(int punish) { - this.punish = punish; - } - - public int getPersuade() { - return persuade; - } - - public void setPersuade(int persuade) { - this.persuade = persuade; - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java b/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java deleted file mode 100644 index 00b6a98..0000000 --- a/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.casic.dcms.model; - -import java.util.List; - -public class PunishTypeBean { - private int code; - private String message; - private boolean success; - private List data; - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - 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 List getData() { - return data; - } - - public void setData(List data) { - this.data = data; - } - - public static class DataBean { - /** - * punishTime : 2021-01-12 09:08:59 - * punishTypeName : 处罚 - * punishImage : images - * punishType : 1 - * punishRemarks : 处罚 - */ - - private String punishTime; - private String punishTypeName; - private String punishImage; - private String punishType; - private String punishRemarks; - - public String getPunishTime() { - return punishTime; - } - - public void setPunishTime(String punishTime) { - this.punishTime = punishTime; - } - - public String getPunishTypeName() { - return punishTypeName; - } - - public void setPunishTypeName(String punishTypeName) { - this.punishTypeName = punishTypeName; - } - - public String getPunishImage() { - return punishImage; - } - - public void setPunishImage(String punishImage) { - this.punishImage = punishImage; - } - - public String getPunishType() { - return punishType; - } - - public void setPunishType(String punishType) { - this.punishType = punishType; - } - - public String getPunishRemarks() { - return punishRemarks; - } - - public void setPunishRemarks(String punishRemarks) { - this.punishRemarks = punishRemarks; - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/UnitFeatureBean.java b/app/src/main/java/com/casic/dcms/model/UnitFeatureBean.java deleted file mode 100644 index a4d8337..0000000 --- a/app/src/main/java/com/casic/dcms/model/UnitFeatureBean.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.casic.dcms.model; - -public class UnitFeatureBean { - - private String BGID; - private String BGNAME; - private int OBJECTID; - - public String getBGID() { - return BGID; - } - - public void setBGID(String BGID) { - this.BGID = BGID; - } - - public String getBGNAME() { - return BGNAME; - } - - public void setBGNAME(String BGNAME) { - this.BGNAME = BGNAME; - } - - public int getOBJECTID() { - return OBJECTID; - } - - public void setOBJECTID(int OBJECTID) { - this.OBJECTID = OBJECTID; - } -} diff --git a/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java b/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java index 0578f7b..b0c24d5 100644 --- a/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java +++ b/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java @@ -1,9 +1,16 @@ package com.casic.dcms.model; +import android.os.Parcel; +import android.os.Parcelable; + +import androidx.annotation.NonNull; + import java.util.List; -public class WellAlarmListBean { - +/** + * Parcelable 是 Android 平台专门为性能优化而设计的序列化机制,通常比 Serializable 快 10 倍左右 + */ +public class WellAlarmListBean implements Parcelable { private int code; private DataBean data; private String message; @@ -41,7 +48,43 @@ this.success = success; } - public static class DataBean { + public WellAlarmListBean() { + + } + + protected WellAlarmListBean(Parcel in) { + code = in.readInt(); + data = in.readParcelable(DataBean.class.getClassLoader()); + message = in.readString(); + success = in.readByte() != 0; + } + + public static final Creator CREATOR = new Creator() { + @Override + public WellAlarmListBean createFromParcel(Parcel in) { + return new WellAlarmListBean(in); + } + + @Override + public WellAlarmListBean[] newArray(int size) { + return new WellAlarmListBean[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + dest.writeInt(code); + dest.writeParcelable(data, flags); + dest.writeString(message); + dest.writeByte((byte) (success ? 1 : 0)); + } + + public static class DataBean implements Parcelable { private int total; private List rows; @@ -62,7 +105,38 @@ this.rows = rows; } - public static class RowsBean { + public DataBean() { + } + + protected DataBean(Parcel in) { + total = in.readInt(); + rows = in.createTypedArrayList(RowsBean.CREATOR); + } + + public static final Creator CREATOR = new Creator() { + @Override + public DataBean createFromParcel(Parcel in) { + return new DataBean(in); + } + + @Override + public DataBean[] newArray(int size) { + return new DataBean[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(total); + dest.writeTypedList(rows); + } + + public static class RowsBean implements Parcelable { /** * alarmContent : 1 * deptName : 崇仁县城管局 @@ -296,6 +370,79 @@ public void setStatus(String status) { this.status = status; } + + public RowsBean() { + } + + protected RowsBean(Parcel in) { + alarmContent = in.readInt(); + deptName = in.readString(); + jobStatus = in.readString(); + alarmContentName = in.readString(); + wellCode = in.readString(); + alarmTime = in.readString(); + deptid = in.readString(); + alarmTypeName = in.readString(); + alarmMessage = in.readString(); + staff = in.readString(); + deviceId = in.readString(); + jobId = in.readString(); + jobStatusName = in.readString(); + alarmType = in.readString(); + alarmValue = in.readString(); + devcode = in.readString(); + statusName = in.readString(); + alarmLevel = in.readString(); + tel = in.readString(); + id = in.readString(); + wellId = in.readString(); + position = in.readString(); + status = in.readString(); + } + + public static final Creator CREATOR = new Creator() { + @Override + public RowsBean createFromParcel(Parcel in) { + return new RowsBean(in); + } + + @Override + public RowsBean[] newArray(int size) { + return new RowsBean[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(alarmContent); + dest.writeString(deptName); + dest.writeString(jobStatus); + dest.writeString(alarmContentName); + dest.writeString(wellCode); + dest.writeString(alarmTime); + dest.writeString(deptid); + dest.writeString(alarmTypeName); + dest.writeString(alarmMessage); + dest.writeString(staff); + dest.writeString(deviceId); + dest.writeString(jobId); + dest.writeString(jobStatusName); + dest.writeString(alarmType); + dest.writeString(alarmValue); + dest.writeString(devcode); + dest.writeString(statusName); + dest.writeString(alarmLevel); + dest.writeString(tel); + dest.writeString(id); + dest.writeString(wellId); + dest.writeString(position); + dest.writeString(status); + } } } } diff --git a/app/src/main/java/com/casic/dcms/model/WellDetailBean.java b/app/src/main/java/com/casic/dcms/model/WellDetailBean.java index cea8774..4e6c8fd 100644 --- a/app/src/main/java/com/casic/dcms/model/WellDetailBean.java +++ b/app/src/main/java/com/casic/dcms/model/WellDetailBean.java @@ -60,7 +60,6 @@ } public static class FieldAliasesBean { - private String objectid; private String 编号; private String 附属物编码; @@ -190,7 +189,6 @@ } public static class SpatialReferenceBean { - private int wkid; private int latestWkid; @@ -212,7 +210,6 @@ } public static class FieldsBean { - private String name; private String type; private String alias; @@ -252,7 +249,6 @@ } public static class FeaturesBean { - private AttributesBean attributes; private GeometryBean geometry; diff --git a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java index 8b15d77..6f1d941 100644 --- a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java @@ -621,8 +621,8 @@ /** * 报警列表 */ - public static Observable getAlarmList(int limit, int offset) { - return api.getAlarmList(AuthenticationHelper.getToken(), "1", limit, offset); + public static Observable getAlarmList(int offset) { + return api.getAlarmList(AuthenticationHelper.getToken(), "1", LocaleConstant.PAGE_LIMIT, offset); } /** @@ -662,18 +662,15 @@ return api.optionWellStatus(AuthenticationHelper.getToken(), bfzt); } + private static final RetrofitService arcgisApi = RetrofitFactory.createRetrofit( + "http://111.198.10.15:13002", RetrofitService.class, true + ); + /** * 报警窨井详情 */ public static Observable getWellDetailResult(String where) { -// Retrofit retrofit = new Retrofit.Builder() -// .baseUrl("http://111.198.10.15:13002") -// .addConverterFactory(GsonConverterFactory.create())//Gson转换器 -// .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) -// .client(createOKHttpClient())//log拦截器 -// .build(); -// RetrofitService service = retrofit.create(RetrofitService.class); - return api.getWellDetail( + return arcgisApi.getWellDetail( "json", "4326", "4326", "*", true, where ); } diff --git a/app/src/main/java/com/casic/dcms/view/pipeline/AlarmOnMapActivity.java b/app/src/main/java/com/casic/dcms/view/pipeline/AlarmOnMapActivity.java new file mode 100644 index 0000000..e3dc01d --- /dev/null +++ b/app/src/main/java/com/casic/dcms/view/pipeline/AlarmOnMapActivity.java @@ -0,0 +1,212 @@ +package com.casic.dcms.view.pipeline; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.DialogInterface; +import android.graphics.Color; +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; + +import com.casic.dcms.R; +import com.casic.dcms.databinding.ActivityMapAlarmBinding; +import com.casic.dcms.model.WellAlarmListBean; +import com.casic.dcms.model.WellDetailBean; +import com.casic.dcms.utils.ArcGisMapCreator; +import com.casic.dcms.utils.LocaleConstant; +import com.casic.dcms.utils.ViewGroupKit; +import com.casic.dcms.vm.WellViewModel; +import com.esri.arcgisruntime.geometry.Point; +import com.esri.arcgisruntime.mapping.ArcGISMap; +import com.esri.arcgisruntime.mapping.Basemap; +import com.esri.arcgisruntime.mapping.BasemapStyle; +import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; +import com.esri.arcgisruntime.mapping.view.Graphic; +import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; +import com.esri.arcgisruntime.symbology.SimpleMarkerSymbol; +import com.esri.arcgisruntime.util.ListenableList; +import com.pengxh.androidx.lite.base.AndroidxBaseActivity; +import com.pengxh.androidx.lite.utils.LoadState; +import com.pengxh.androidx.lite.utils.LoadingDialog; +import com.pengxh.androidx.lite.widget.TitleBarView; +import com.qmuiteam.qmui.util.QMUIDisplayHelper; +import com.qmuiteam.qmui.widget.dialog.QMUIDialog; +import com.qmuiteam.qmui.widget.popup.QMUIPopup; +import com.qmuiteam.qmui.widget.popup.QMUIPopups; + +import java.util.ArrayList; +import java.util.List; + +public class AlarmOnMapActivity extends AndroidxBaseActivity { + + private static final String TAG = "AlarmOnMapActivity"; + private final Context context = this; + private final List geometryList = new ArrayList<>(); + private WellViewModel wellViewModel; + + @Override + protected void setupTopBarLayout() { + ViewGroupKit.initImmersionBar(binding.rootView, this, true, R.color.white); + binding.titleView.setOnClickListener(new TitleBarView.OnClickListener() { + @Override + public void onLeftClick() { + finish(); + } + + @Override + public void onRightClick() { + + } + }); + } + + @Override + protected void observeRequestState() { + wellViewModel.loadState.observe(this, new Observer() { + @Override + public void onChanged(LoadState loadState) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(AlarmOnMapActivity.this, "数据加载中,请稍后"); + } else { + LoadingDialog.dismiss(); + } + } + }); + } + + @Override + public void initOnCreate(@Nullable Bundle savedInstanceState) { + binding.mapView.setAttributionTextVisible(false);//去掉左下角属性标识 + binding.mapView.setViewpointScaleAsync(64000); + ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_STREETS); + //创建底图、并设置底图图层 + Basemap basemap = new Basemap(ArcGisMapCreator.createNoGridLayer()); + arcGISMap.setBasemap(basemap); + binding.mapView.setMap(arcGISMap); + + wellViewModel = new ViewModelProvider(this).get(WellViewModel.class); + wellViewModel.resultModel.observe(this, new Observer() { + @Override + public void onChanged(WellDetailBean wellDetailBean) { + List features = wellDetailBean.getFeatures(); + if (features.size() > 0) { + WellDetailBean.FeaturesBean featuresBean = features.get(0); + //将获取到的井数据缓存起来 + geometryList.add(featuresBean); + WellDetailBean.FeaturesBean.GeometryBean geometryBean = featuresBean.getGeometry(); + //每获取一个点就绘制出 + addMarker(new Point(geometryBean.getX(), geometryBean.getY())); + } + } + }); + + Bundle extras = getIntent().getExtras(); + if (extras != null) { + List dataBeans = extras.getParcelableArrayList("rows_list"); + if (dataBeans == null) { + return; + } + for (WellAlarmListBean.DataBean.RowsBean dataBean : dataBeans) { + String queryParam = "编号='" + dataBean.getWellCode() + "'"; + Log.d(TAG, "queryParam: " + queryParam); + wellViewModel.getWellDetail(context, queryParam); + } + } + } + + @SuppressLint("ClickableViewAccessibility") + @Override + public void initEvent() { + binding.expandMapView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 0.5); + } + }); + binding.minusMapView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 2); + } + }); + + binding.mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, binding.mapView) { + @Override + public boolean onSingleTapConfirmed(MotionEvent e) { + android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); + Point clickPoint = binding.mapView.screenToLocation(screenPoint); + if (geometryList.size() > 0) { + List tempList = new ArrayList<>(); + for (WellDetailBean.FeaturesBean featuresBean : geometryList) { + WellDetailBean.FeaturesBean.GeometryBean dataBean = featuresBean.getGeometry(); + if (Math.abs(dataBean.getX() - clickPoint.getX()) <= 10 * LocaleConstant.DELTA_LNG_10 && + Math.abs(dataBean.getY() - clickPoint.getY()) <= 10 * LocaleConstant.DELTA_LNG_10) { + tempList.add(featuresBean); + } + } + if (tempList.size() > 0) { + QMUIDialog.MenuDialogBuilder menuDialogBuilder = new QMUIDialog.MenuDialogBuilder(context); + menuDialogBuilder.setTitle("请选择您要查看的窨井"); + for (WellDetailBean.FeaturesBean dataBean : tempList) { + menuDialogBuilder.addItem(dataBean.getAttributes().get编号(), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + + View popupView = LayoutInflater.from(context).inflate(R.layout.popu_well, null); + TextView wellCodeView = popupView.findViewById(R.id.wellCodeView); + TextView wellTypeView = popupView.findViewById(R.id.wellTypeView); + TextView wellPositionView = popupView.findViewById(R.id.wellPositionView); + + WellDetailBean.FeaturesBean.AttributesBean attributes = dataBean.getAttributes(); + wellCodeView.setText(attributes.get编号()); + wellTypeView.setText(attributes.get附属物名称()); + wellPositionView.setText(attributes.get所属道路()); + + QMUIPopups.popup(context, QMUIDisplayHelper.dp2px(context, 290)) + .preferredDirection(QMUIPopup.DIRECTION_BOTTOM) + .view(popupView) + .edgeProtection(QMUIDisplayHelper.dp2px(context, 20)) + .dimAmount(0.6f) + .animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER) + .onDismiss(null) + .show(binding.mapView); + } + }); + } + menuDialogBuilder.create().show(); + } + } + return super.onSingleTapConfirmed(e); + } + }); + } + + protected void onResume() { + super.onResume(); + binding.mapView.resume(); + } + + @Override + protected void onPause() { + super.onPause(); + binding.mapView.pause(); + } + + private void addMarker(Point point) { + SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.RED, 10); + Graphic graphic = new Graphic(point, simpleMarkerSymbol); + GraphicsOverlay mGraphicsOverlay = new GraphicsOverlay(); + ListenableList overlayGraphics = mGraphicsOverlay.getGraphics(); + ListenableList graphicsOverlays = binding.mapView.getGraphicsOverlays(); + overlayGraphics.add(graphic); + graphicsOverlays.add(mGraphicsOverlay); + } +} diff --git a/app/src/main/java/com/casic/dcms/view/pipeline/PipelineManagerActivity.java b/app/src/main/java/com/casic/dcms/view/pipeline/PipelineManagerActivity.java index e2e6656..eac37ed 100644 --- a/app/src/main/java/com/casic/dcms/view/pipeline/PipelineManagerActivity.java +++ b/app/src/main/java/com/casic/dcms/view/pipeline/PipelineManagerActivity.java @@ -1,6 +1,7 @@ package com.casic.dcms.view.pipeline; import android.content.Context; +import android.content.Intent; import android.graphics.Color; import android.os.Bundle; import android.os.Handler; @@ -75,7 +76,13 @@ showBatchCancelDialog(); break; case 1: - ContextKit.navigatePageTo(context, WarningOnMapActivity.class); + if (dataBeans.isEmpty()) { + StringKit.show(context, "无报警数据"); + return; + } + Intent intent = new Intent(context, AlarmOnMapActivity.class); + intent.putParcelableArrayListExtra("rows_list", new ArrayList<>(dataBeans)); + context.startActivity(intent); break; case 2: ContextKit.navigatePageTo(context, WellListActivity.class); @@ -153,7 +160,7 @@ } private void getAlarmList() { - alarmViewModel.getAlarmList(this, LocaleConstant.PAGE_LIMIT, page); + alarmViewModel.getAlarmList(this, page); } @Override diff --git a/app/src/main/java/com/casic/dcms/view/pipeline/WarningOnMapActivity.java b/app/src/main/java/com/casic/dcms/view/pipeline/WarningOnMapActivity.java deleted file mode 100644 index 66a38d0..0000000 --- a/app/src/main/java/com/casic/dcms/view/pipeline/WarningOnMapActivity.java +++ /dev/null @@ -1,230 +0,0 @@ -package com.casic.dcms.view.pipeline; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.content.DialogInterface; -import android.graphics.Color; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.widget.TextView; - -import androidx.annotation.Nullable; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProvider; - -import com.casic.dcms.R; -import com.casic.dcms.databinding.ActivityMapWarningBinding; -import com.casic.dcms.model.WellAlarmListBean; -import com.casic.dcms.model.WellDetailBean; -import com.casic.dcms.utils.ArcGisMapCreator; -import com.casic.dcms.utils.LocaleConstant; -import com.casic.dcms.utils.ViewGroupKit; -import com.casic.dcms.vm.AlarmViewModel; -import com.casic.dcms.vm.WellViewModel; -import com.esri.arcgisruntime.geometry.Point; -import com.esri.arcgisruntime.mapping.ArcGISMap; -import com.esri.arcgisruntime.mapping.Basemap; -import com.esri.arcgisruntime.mapping.BasemapStyle; -import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; -import com.esri.arcgisruntime.mapping.view.Graphic; -import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; -import com.esri.arcgisruntime.symbology.SimpleMarkerSymbol; -import com.esri.arcgisruntime.util.ListenableList; -import com.pengxh.androidx.lite.base.AndroidxBaseActivity; -import com.pengxh.androidx.lite.utils.LoadState; -import com.pengxh.androidx.lite.utils.LoadingDialog; -import com.pengxh.androidx.lite.utils.SaveKeyValues; -import com.pengxh.androidx.lite.widget.TitleBarView; -import com.qmuiteam.qmui.util.QMUIDisplayHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; -import com.qmuiteam.qmui.widget.popup.QMUIPopup; -import com.qmuiteam.qmui.widget.popup.QMUIPopups; - -import java.util.ArrayList; -import java.util.List; - -public class WarningOnMapActivity extends AndroidxBaseActivity { - - private static final String TAG = "WarningOnMapActivity"; - private final Context context = this; - private final List geometryList = new ArrayList<>(); - private AlarmViewModel alarmViewModel; - private WellViewModel wellViewModel; - - @Override - protected void setupTopBarLayout() { - ViewGroupKit.initImmersionBar(binding.rootView, this, true, R.color.white); - binding.titleView.setOnClickListener(new TitleBarView.OnClickListener() { - @Override - public void onLeftClick() { - finish(); - } - - @Override - public void onRightClick() { - - } - }); - } - - @Override - protected void observeRequestState() { - alarmViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - if (loadState == LoadState.Loading) { - LoadingDialog.show(WarningOnMapActivity.this, "数据加载中,请稍后"); - } else { - LoadingDialog.dismiss(); - } - } - }); - - wellViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - - } - }); - } - - @Override - public void initOnCreate(@Nullable Bundle savedInstanceState) { - binding.mapView.setAttributionTextVisible(false);//去掉左下角属性标识 - binding.mapView.setViewpointScaleAsync(64000); - ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_STREETS); - //创建底图、并设置底图图层 - Basemap basemap = new Basemap(ArcGisMapCreator.createNoGridLayer()); - arcGISMap.setBasemap(basemap); - binding.mapView.setMap(arcGISMap); - - int alarmTotal = (int) SaveKeyValues.getValue("alarmTotal", LocaleConstant.PAGE_LIMIT); - alarmViewModel = new ViewModelProvider(this).get(AlarmViewModel.class); - alarmViewModel.wellAlarmListResult.observe(this, new Observer() { - @Override - public void onChanged(WellAlarmListBean alarmDataBean) { - if (alarmDataBean.getCode() == 200) { - List dataRows = alarmDataBean.getData().getRows(); - for (WellAlarmListBean.DataBean.RowsBean rowsBean : dataRows) { - String queryParam = "编号='" + rowsBean.getWellCode() + "'"; - wellViewModel.getWellDetail(context, queryParam); - } - } - } - }); - alarmViewModel.getAlarmList(this, alarmTotal, 1); - - wellViewModel = new ViewModelProvider(this).get(WellViewModel.class); - wellViewModel.resultModel.observe(this, new Observer() { - @Override - public void onChanged(WellDetailBean wellDetailBean) { - List features = wellDetailBean.getFeatures(); - if (features.size() > 0) { - WellDetailBean.FeaturesBean featuresBean = features.get(0); - //将获取到的井数据缓存起来 - geometryList.add(featuresBean); - WellDetailBean.FeaturesBean.GeometryBean geometryBean = featuresBean.getGeometry(); - //每获取一个点就绘制出 - addMarker(new Point(geometryBean.getX(), geometryBean.getY())); - } - } - }); - } - - @SuppressLint("ClickableViewAccessibility") - @Override - public void initEvent() { - binding.expandMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 0.5); - } - }); - binding.minusMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 2); - } - }); - - binding.mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, binding.mapView) { - @Override - public boolean onSingleTapConfirmed(MotionEvent e) { - android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); - Point clickPoint = binding.mapView.screenToLocation(screenPoint); - if (geometryList.size() > 0) { - List tempList = new ArrayList<>(); - for (WellDetailBean.FeaturesBean featuresBean : geometryList) { - WellDetailBean.FeaturesBean.GeometryBean dataBean = featuresBean.getGeometry(); - if (Math.abs(dataBean.getX() - clickPoint.getX()) <= 10 * LocaleConstant.DELTA_LNG_10 && - Math.abs(dataBean.getY() - clickPoint.getY()) <= 10 * LocaleConstant.DELTA_LNG_10) { - tempList.add(featuresBean); - } - } - if (tempList.size() > 0) { - QMUIDialog.MenuDialogBuilder menuDialogBuilder = new QMUIDialog.MenuDialogBuilder(context); - menuDialogBuilder.setTitle("请选择您要查看的窨井"); - for (WellDetailBean.FeaturesBean dataBean : tempList) { - menuDialogBuilder.addItem(dataBean.getAttributes().get编号(), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - - View popupView = LayoutInflater.from(context).inflate(R.layout.popu_well, null); - TextView wellCodeView = popupView.findViewById(R.id.wellCodeView); - TextView wellTypeView = popupView.findViewById(R.id.wellTypeView); - TextView wellPositionView = popupView.findViewById(R.id.wellPositionView); - - WellDetailBean.FeaturesBean.AttributesBean attributes = dataBean.getAttributes(); - wellCodeView.setText(attributes.get编号()); - wellTypeView.setText(attributes.get附属物名称()); - wellPositionView.setText(attributes.get所属道路()); - - QMUIPopups.popup(context, QMUIDisplayHelper.dp2px(context, 290)) - .preferredDirection(QMUIPopup.DIRECTION_BOTTOM) - .view(popupView) - .edgeProtection(QMUIDisplayHelper.dp2px(context, 20)) - .dimAmount(0.6f) - .animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER) - .onDismiss(null) - .show(binding.mapView); - } - }); - } - menuDialogBuilder.create().show(); - } - } - return super.onSingleTapConfirmed(e); - } - }); - } - - protected void onResume() { - super.onResume(); - binding.mapView.resume(); - } - - @Override - protected void onPause() { - super.onPause(); - binding.mapView.pause(); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - binding.mapView.dispose(); - } - - private void addMarker(Point point) { - SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.RED, 10); - Graphic graphic = new Graphic(point, simpleMarkerSymbol); - GraphicsOverlay mGraphicsOverlay = new GraphicsOverlay(); - ListenableList overlayGraphics = mGraphicsOverlay.getGraphics(); - ListenableList graphicsOverlays = binding.mapView.getGraphicsOverlays(); - overlayGraphics.add(graphic); - graphicsOverlays.add(mGraphicsOverlay); - } -} diff --git a/app/src/main/java/com/casic/dcms/vm/AlarmViewModel.java b/app/src/main/java/com/casic/dcms/vm/AlarmViewModel.java index 1e5dabd..e08affa 100644 --- a/app/src/main/java/com/casic/dcms/vm/AlarmViewModel.java +++ b/app/src/main/java/com/casic/dcms/vm/AlarmViewModel.java @@ -25,9 +25,9 @@ public MutableLiveData wellAlarmListResult = new MutableLiveData<>(); public MutableLiveData cancelActionModel = new MutableLiveData<>(); - public void getAlarmList(Context context, int limit, int offset) { + public void getAlarmList(Context context, int offset) { loadState.setValue(LoadState.Loading); - Observable alarmListObservable = RetrofitServiceManager.getAlarmList(limit, offset); + Observable alarmListObservable = RetrofitServiceManager.getAlarmList(offset); ObserverSubscriber.addSubscribe(alarmListObservable, new ObserverSubscriber.OnObserverCallback() { @Override public void onCompleted() { diff --git a/app/src/main/res/layout/activity_map_alarm.xml b/app/src/main/res/layout/activity_map_alarm.xml new file mode 100644 index 0000000..4887af9 --- /dev/null +++ b/app/src/main/res/layout/activity_map_alarm.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_map_warning.xml b/app/src/main/res/layout/activity_map_warning.xml deleted file mode 100644 index 4887af9..0000000 --- a/app/src/main/res/layout/activity_map_warning.xml +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/item_package_rv.xml b/app/src/main/res/layout/item_package_rv.xml deleted file mode 100644 index f6f1a1b..0000000 --- a/app/src/main/res/layout/item_package_rv.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.gitignore b/.gitignore index f0f71e2..ee6b213 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,12 @@ *.iml .gradle /local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml +/.idea .DS_Store /build /captures .externalNativeBuild .cxx .idea +*.apk +*.json diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fdb7255..6873489 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -109,7 +109,7 @@ - + diff --git a/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java b/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java index 2dcdc64..0364fc7 100644 --- a/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java +++ b/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java @@ -9,6 +9,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; @@ -25,7 +26,6 @@ private final Context context; private final List dataRows; private final LayoutInflater layoutInflater; - private PunishTypeAdapter adapter; public PackageCaseListAdapter(Context context, List dataRows) { this.context = context; @@ -36,7 +36,7 @@ @NonNull @Override public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new ItemViewHolder(layoutInflater.inflate(R.layout.item_package_rv, parent, false)); + return new ItemViewHolder(layoutInflater.inflate(R.layout.item_package_rv_l, parent, false)); } @Override @@ -57,16 +57,67 @@ return dataRows.size(); } - @SuppressLint("NotifyDataSetChanged") - public void refresh(List dataRows) { - this.dataRows.clear(); - this.dataRows.addAll(dataRows); - notifyDataSetChanged(); + public void refresh(List newRows) { + DiffUtil.Callback diffCallback = new DiffUtil.Callback() { + + @Override + public int getOldListSize() { + return dataRows.size(); + } + + @Override + public int getNewListSize() { + return newRows.size(); + } + + @Override + public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { + if (dataRows == null || newRows == null) { + return false; + } + + // 检查索引是否在有效范围内 + if (oldItemPosition < 0 || oldItemPosition >= dataRows.size() || + newItemPosition < 0 || newItemPosition >= newRows.size()) { + return false; + } + + // 获取元素并进行比较 + Object oldItem = dataRows.get(oldItemPosition); + Object newItem = newRows.get(newItemPosition); + + // 处理空指针情况 + if (oldItem == null && newItem == null) { + return true; + } + if (oldItem == null || newItem == null) { + return false; + } + + return oldItem.equals(newItem); + } + + @Override + public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { + return dataRows.get(oldItemPosition) == newRows.get(newItemPosition); + } + }; + + DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallback); + + dataRows.clear(); + dataRows.addAll(newRows); + + diffResult.dispatchUpdatesTo(this); } - public void loadMore(List dataRows) { - this.dataRows.addAll(dataRows); - notifyItemRangeInserted(this.dataRows.size(), dataRows.size()); + public void loadMore(List newRows) { + if (newRows.isEmpty()) { + return; + } + int startPosition = this.dataRows.size(); + this.dataRows.addAll(newRows); + notifyItemRangeInserted(startPosition, newRows.size()); } class ItemViewHolder extends RecyclerView.ViewHolder { @@ -84,7 +135,6 @@ casePunishView = itemView.findViewById(R.id.casePunishView); } - void bindView(PackageCaseBean.DataBean.RowsBean rowsBean) { //三包核实图片 String fileIdVerify = rowsBean.getFileIdVerify(); @@ -97,45 +147,6 @@ } caseTitleView.setText(rowsBean.getDescription()); caseDateView.setText("上报时间:" + rowsBean.getReportTime()); -// HttpRequestHelper.doRequest(LocaleConstant.SHOP_PUNISH_LIST, rowsBean.getShopId(), new IHttpRequestListener() { -// @Override -// public void onSuccess(ResponseBody resultBean) { -// try { -// PunishTypeBean punishTypeBean = gson.fromJson(resultBean.string(), PunishTypeBean.class); -// if (punishTypeBean.getData().size() != 0) { -// //获取商铺处罚次数 -// HttpRequestHelper.doRequest(LocaleConstant.SHOP_PUNISH_TYPE, rowsBean.getShopId(), new IHttpRequestListener() { -// @Override -// public void onSuccess(ResponseBody resultBean) { -// try { -// PunishTimesBean punishTimesBean = gson.fromJson(resultBean.string(), PunishTimesBean.class); -// -// adapter = new PunishTypeAdapter(context, punishTypeBean.getData(), punishTimesBean.getData()); -// LinearLayoutManager layoutManager = new LinearLayoutManager(context); -// layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); -// punishRecyclerView.setLayoutManager(layoutManager); -// punishRecyclerView.setAdapter(adapter); -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } -// -// @Override -// public void onFailure(Throwable throwable) { -// -// } -// }); -// } -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } -// -// @Override -// public void onFailure(Throwable throwable) { -// -// } -// }); } } diff --git a/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java b/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java deleted file mode 100644 index 2e178e5..0000000 --- a/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.casic.dcms.adapter; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.core.content.ContextCompat; -import androidx.recyclerview.widget.RecyclerView; - -import com.casic.dcms.R; -import com.casic.dcms.model.PunishTimesBean; -import com.casic.dcms.model.PunishTypeBean; - -import java.util.List; - -@SuppressLint("SetTextI18n") -public class PunishTypeAdapter extends RecyclerView.Adapter { - - private final Context context; - private final List dataRows; - private final PunishTimesBean.DataBean dataBean; - private final LayoutInflater layoutInflater; - - PunishTypeAdapter(Context context, List dataRows, PunishTimesBean.DataBean dataBean) { - this.context = context; - this.dataRows = dataRows; - this.dataBean = dataBean; - this.layoutInflater = LayoutInflater.from(context); - } - - @NonNull - @Override - public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new ItemViewHolder(layoutInflater.inflate(R.layout.item_punish_recycleview, parent, false)); - } - - @Override - public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { - String typeName = dataRows.get(position).getPunishTypeName(); - int color, times; - switch (typeName) { - case "劝导": - times = dataBean.getPersuade(); - color = ContextCompat.getColor(context, R.color.persuadeColor); - break; - case "警告": - times = dataBean.getWarn(); - color = ContextCompat.getColor(context, R.color.warnColor); - break; - case "处罚": - times = dataBean.getPunish(); - color = ContextCompat.getColor(context, R.color.punishColor); - break; - default: - times = 0; - color = ContextCompat.getColor(context, R.color.mainThemeColor); - break; - } - if (times == 0) { - holder.punishTypeView.setVisibility(View.GONE); - } else { - holder.punishTypeView.setText(typeName + " x " + times); - holder.punishTypeView.setBackgroundColor(color); - } - } - - @Override - public int getItemCount() { - return dataRows.size(); - } - - static class ItemViewHolder extends RecyclerView.ViewHolder { - - private final TextView punishTypeView; - - ItemViewHolder(@NonNull View itemView) { - super(itemView); - punishTypeView = itemView.findViewById(R.id.punishTypeView); - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java b/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java deleted file mode 100644 index dc57ca3..0000000 --- a/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.dcms.model; - -public class PunishTimesBean { - 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 { - /** - * warn : 0 - * punish : 0 - * persuade : 0 - */ - - private int warn; - private int punish; - private int persuade; - - public int getWarn() { - return warn; - } - - public void setWarn(int warn) { - this.warn = warn; - } - - public int getPunish() { - return punish; - } - - public void setPunish(int punish) { - this.punish = punish; - } - - public int getPersuade() { - return persuade; - } - - public void setPersuade(int persuade) { - this.persuade = persuade; - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java b/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java deleted file mode 100644 index 00b6a98..0000000 --- a/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.casic.dcms.model; - -import java.util.List; - -public class PunishTypeBean { - private int code; - private String message; - private boolean success; - private List data; - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - 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 List getData() { - return data; - } - - public void setData(List data) { - this.data = data; - } - - public static class DataBean { - /** - * punishTime : 2021-01-12 09:08:59 - * punishTypeName : 处罚 - * punishImage : images - * punishType : 1 - * punishRemarks : 处罚 - */ - - private String punishTime; - private String punishTypeName; - private String punishImage; - private String punishType; - private String punishRemarks; - - public String getPunishTime() { - return punishTime; - } - - public void setPunishTime(String punishTime) { - this.punishTime = punishTime; - } - - public String getPunishTypeName() { - return punishTypeName; - } - - public void setPunishTypeName(String punishTypeName) { - this.punishTypeName = punishTypeName; - } - - public String getPunishImage() { - return punishImage; - } - - public void setPunishImage(String punishImage) { - this.punishImage = punishImage; - } - - public String getPunishType() { - return punishType; - } - - public void setPunishType(String punishType) { - this.punishType = punishType; - } - - public String getPunishRemarks() { - return punishRemarks; - } - - public void setPunishRemarks(String punishRemarks) { - this.punishRemarks = punishRemarks; - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/UnitFeatureBean.java b/app/src/main/java/com/casic/dcms/model/UnitFeatureBean.java deleted file mode 100644 index a4d8337..0000000 --- a/app/src/main/java/com/casic/dcms/model/UnitFeatureBean.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.casic.dcms.model; - -public class UnitFeatureBean { - - private String BGID; - private String BGNAME; - private int OBJECTID; - - public String getBGID() { - return BGID; - } - - public void setBGID(String BGID) { - this.BGID = BGID; - } - - public String getBGNAME() { - return BGNAME; - } - - public void setBGNAME(String BGNAME) { - this.BGNAME = BGNAME; - } - - public int getOBJECTID() { - return OBJECTID; - } - - public void setOBJECTID(int OBJECTID) { - this.OBJECTID = OBJECTID; - } -} diff --git a/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java b/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java index 0578f7b..b0c24d5 100644 --- a/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java +++ b/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java @@ -1,9 +1,16 @@ package com.casic.dcms.model; +import android.os.Parcel; +import android.os.Parcelable; + +import androidx.annotation.NonNull; + import java.util.List; -public class WellAlarmListBean { - +/** + * Parcelable 是 Android 平台专门为性能优化而设计的序列化机制,通常比 Serializable 快 10 倍左右 + */ +public class WellAlarmListBean implements Parcelable { private int code; private DataBean data; private String message; @@ -41,7 +48,43 @@ this.success = success; } - public static class DataBean { + public WellAlarmListBean() { + + } + + protected WellAlarmListBean(Parcel in) { + code = in.readInt(); + data = in.readParcelable(DataBean.class.getClassLoader()); + message = in.readString(); + success = in.readByte() != 0; + } + + public static final Creator CREATOR = new Creator() { + @Override + public WellAlarmListBean createFromParcel(Parcel in) { + return new WellAlarmListBean(in); + } + + @Override + public WellAlarmListBean[] newArray(int size) { + return new WellAlarmListBean[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + dest.writeInt(code); + dest.writeParcelable(data, flags); + dest.writeString(message); + dest.writeByte((byte) (success ? 1 : 0)); + } + + public static class DataBean implements Parcelable { private int total; private List rows; @@ -62,7 +105,38 @@ this.rows = rows; } - public static class RowsBean { + public DataBean() { + } + + protected DataBean(Parcel in) { + total = in.readInt(); + rows = in.createTypedArrayList(RowsBean.CREATOR); + } + + public static final Creator CREATOR = new Creator() { + @Override + public DataBean createFromParcel(Parcel in) { + return new DataBean(in); + } + + @Override + public DataBean[] newArray(int size) { + return new DataBean[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(total); + dest.writeTypedList(rows); + } + + public static class RowsBean implements Parcelable { /** * alarmContent : 1 * deptName : 崇仁县城管局 @@ -296,6 +370,79 @@ public void setStatus(String status) { this.status = status; } + + public RowsBean() { + } + + protected RowsBean(Parcel in) { + alarmContent = in.readInt(); + deptName = in.readString(); + jobStatus = in.readString(); + alarmContentName = in.readString(); + wellCode = in.readString(); + alarmTime = in.readString(); + deptid = in.readString(); + alarmTypeName = in.readString(); + alarmMessage = in.readString(); + staff = in.readString(); + deviceId = in.readString(); + jobId = in.readString(); + jobStatusName = in.readString(); + alarmType = in.readString(); + alarmValue = in.readString(); + devcode = in.readString(); + statusName = in.readString(); + alarmLevel = in.readString(); + tel = in.readString(); + id = in.readString(); + wellId = in.readString(); + position = in.readString(); + status = in.readString(); + } + + public static final Creator CREATOR = new Creator() { + @Override + public RowsBean createFromParcel(Parcel in) { + return new RowsBean(in); + } + + @Override + public RowsBean[] newArray(int size) { + return new RowsBean[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(alarmContent); + dest.writeString(deptName); + dest.writeString(jobStatus); + dest.writeString(alarmContentName); + dest.writeString(wellCode); + dest.writeString(alarmTime); + dest.writeString(deptid); + dest.writeString(alarmTypeName); + dest.writeString(alarmMessage); + dest.writeString(staff); + dest.writeString(deviceId); + dest.writeString(jobId); + dest.writeString(jobStatusName); + dest.writeString(alarmType); + dest.writeString(alarmValue); + dest.writeString(devcode); + dest.writeString(statusName); + dest.writeString(alarmLevel); + dest.writeString(tel); + dest.writeString(id); + dest.writeString(wellId); + dest.writeString(position); + dest.writeString(status); + } } } } diff --git a/app/src/main/java/com/casic/dcms/model/WellDetailBean.java b/app/src/main/java/com/casic/dcms/model/WellDetailBean.java index cea8774..4e6c8fd 100644 --- a/app/src/main/java/com/casic/dcms/model/WellDetailBean.java +++ b/app/src/main/java/com/casic/dcms/model/WellDetailBean.java @@ -60,7 +60,6 @@ } public static class FieldAliasesBean { - private String objectid; private String 编号; private String 附属物编码; @@ -190,7 +189,6 @@ } public static class SpatialReferenceBean { - private int wkid; private int latestWkid; @@ -212,7 +210,6 @@ } public static class FieldsBean { - private String name; private String type; private String alias; @@ -252,7 +249,6 @@ } public static class FeaturesBean { - private AttributesBean attributes; private GeometryBean geometry; diff --git a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java index 8b15d77..6f1d941 100644 --- a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java @@ -621,8 +621,8 @@ /** * 报警列表 */ - public static Observable getAlarmList(int limit, int offset) { - return api.getAlarmList(AuthenticationHelper.getToken(), "1", limit, offset); + public static Observable getAlarmList(int offset) { + return api.getAlarmList(AuthenticationHelper.getToken(), "1", LocaleConstant.PAGE_LIMIT, offset); } /** @@ -662,18 +662,15 @@ return api.optionWellStatus(AuthenticationHelper.getToken(), bfzt); } + private static final RetrofitService arcgisApi = RetrofitFactory.createRetrofit( + "http://111.198.10.15:13002", RetrofitService.class, true + ); + /** * 报警窨井详情 */ public static Observable getWellDetailResult(String where) { -// Retrofit retrofit = new Retrofit.Builder() -// .baseUrl("http://111.198.10.15:13002") -// .addConverterFactory(GsonConverterFactory.create())//Gson转换器 -// .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) -// .client(createOKHttpClient())//log拦截器 -// .build(); -// RetrofitService service = retrofit.create(RetrofitService.class); - return api.getWellDetail( + return arcgisApi.getWellDetail( "json", "4326", "4326", "*", true, where ); } diff --git a/app/src/main/java/com/casic/dcms/view/pipeline/AlarmOnMapActivity.java b/app/src/main/java/com/casic/dcms/view/pipeline/AlarmOnMapActivity.java new file mode 100644 index 0000000..e3dc01d --- /dev/null +++ b/app/src/main/java/com/casic/dcms/view/pipeline/AlarmOnMapActivity.java @@ -0,0 +1,212 @@ +package com.casic.dcms.view.pipeline; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.DialogInterface; +import android.graphics.Color; +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; + +import com.casic.dcms.R; +import com.casic.dcms.databinding.ActivityMapAlarmBinding; +import com.casic.dcms.model.WellAlarmListBean; +import com.casic.dcms.model.WellDetailBean; +import com.casic.dcms.utils.ArcGisMapCreator; +import com.casic.dcms.utils.LocaleConstant; +import com.casic.dcms.utils.ViewGroupKit; +import com.casic.dcms.vm.WellViewModel; +import com.esri.arcgisruntime.geometry.Point; +import com.esri.arcgisruntime.mapping.ArcGISMap; +import com.esri.arcgisruntime.mapping.Basemap; +import com.esri.arcgisruntime.mapping.BasemapStyle; +import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; +import com.esri.arcgisruntime.mapping.view.Graphic; +import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; +import com.esri.arcgisruntime.symbology.SimpleMarkerSymbol; +import com.esri.arcgisruntime.util.ListenableList; +import com.pengxh.androidx.lite.base.AndroidxBaseActivity; +import com.pengxh.androidx.lite.utils.LoadState; +import com.pengxh.androidx.lite.utils.LoadingDialog; +import com.pengxh.androidx.lite.widget.TitleBarView; +import com.qmuiteam.qmui.util.QMUIDisplayHelper; +import com.qmuiteam.qmui.widget.dialog.QMUIDialog; +import com.qmuiteam.qmui.widget.popup.QMUIPopup; +import com.qmuiteam.qmui.widget.popup.QMUIPopups; + +import java.util.ArrayList; +import java.util.List; + +public class AlarmOnMapActivity extends AndroidxBaseActivity { + + private static final String TAG = "AlarmOnMapActivity"; + private final Context context = this; + private final List geometryList = new ArrayList<>(); + private WellViewModel wellViewModel; + + @Override + protected void setupTopBarLayout() { + ViewGroupKit.initImmersionBar(binding.rootView, this, true, R.color.white); + binding.titleView.setOnClickListener(new TitleBarView.OnClickListener() { + @Override + public void onLeftClick() { + finish(); + } + + @Override + public void onRightClick() { + + } + }); + } + + @Override + protected void observeRequestState() { + wellViewModel.loadState.observe(this, new Observer() { + @Override + public void onChanged(LoadState loadState) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(AlarmOnMapActivity.this, "数据加载中,请稍后"); + } else { + LoadingDialog.dismiss(); + } + } + }); + } + + @Override + public void initOnCreate(@Nullable Bundle savedInstanceState) { + binding.mapView.setAttributionTextVisible(false);//去掉左下角属性标识 + binding.mapView.setViewpointScaleAsync(64000); + ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_STREETS); + //创建底图、并设置底图图层 + Basemap basemap = new Basemap(ArcGisMapCreator.createNoGridLayer()); + arcGISMap.setBasemap(basemap); + binding.mapView.setMap(arcGISMap); + + wellViewModel = new ViewModelProvider(this).get(WellViewModel.class); + wellViewModel.resultModel.observe(this, new Observer() { + @Override + public void onChanged(WellDetailBean wellDetailBean) { + List features = wellDetailBean.getFeatures(); + if (features.size() > 0) { + WellDetailBean.FeaturesBean featuresBean = features.get(0); + //将获取到的井数据缓存起来 + geometryList.add(featuresBean); + WellDetailBean.FeaturesBean.GeometryBean geometryBean = featuresBean.getGeometry(); + //每获取一个点就绘制出 + addMarker(new Point(geometryBean.getX(), geometryBean.getY())); + } + } + }); + + Bundle extras = getIntent().getExtras(); + if (extras != null) { + List dataBeans = extras.getParcelableArrayList("rows_list"); + if (dataBeans == null) { + return; + } + for (WellAlarmListBean.DataBean.RowsBean dataBean : dataBeans) { + String queryParam = "编号='" + dataBean.getWellCode() + "'"; + Log.d(TAG, "queryParam: " + queryParam); + wellViewModel.getWellDetail(context, queryParam); + } + } + } + + @SuppressLint("ClickableViewAccessibility") + @Override + public void initEvent() { + binding.expandMapView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 0.5); + } + }); + binding.minusMapView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 2); + } + }); + + binding.mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, binding.mapView) { + @Override + public boolean onSingleTapConfirmed(MotionEvent e) { + android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); + Point clickPoint = binding.mapView.screenToLocation(screenPoint); + if (geometryList.size() > 0) { + List tempList = new ArrayList<>(); + for (WellDetailBean.FeaturesBean featuresBean : geometryList) { + WellDetailBean.FeaturesBean.GeometryBean dataBean = featuresBean.getGeometry(); + if (Math.abs(dataBean.getX() - clickPoint.getX()) <= 10 * LocaleConstant.DELTA_LNG_10 && + Math.abs(dataBean.getY() - clickPoint.getY()) <= 10 * LocaleConstant.DELTA_LNG_10) { + tempList.add(featuresBean); + } + } + if (tempList.size() > 0) { + QMUIDialog.MenuDialogBuilder menuDialogBuilder = new QMUIDialog.MenuDialogBuilder(context); + menuDialogBuilder.setTitle("请选择您要查看的窨井"); + for (WellDetailBean.FeaturesBean dataBean : tempList) { + menuDialogBuilder.addItem(dataBean.getAttributes().get编号(), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + + View popupView = LayoutInflater.from(context).inflate(R.layout.popu_well, null); + TextView wellCodeView = popupView.findViewById(R.id.wellCodeView); + TextView wellTypeView = popupView.findViewById(R.id.wellTypeView); + TextView wellPositionView = popupView.findViewById(R.id.wellPositionView); + + WellDetailBean.FeaturesBean.AttributesBean attributes = dataBean.getAttributes(); + wellCodeView.setText(attributes.get编号()); + wellTypeView.setText(attributes.get附属物名称()); + wellPositionView.setText(attributes.get所属道路()); + + QMUIPopups.popup(context, QMUIDisplayHelper.dp2px(context, 290)) + .preferredDirection(QMUIPopup.DIRECTION_BOTTOM) + .view(popupView) + .edgeProtection(QMUIDisplayHelper.dp2px(context, 20)) + .dimAmount(0.6f) + .animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER) + .onDismiss(null) + .show(binding.mapView); + } + }); + } + menuDialogBuilder.create().show(); + } + } + return super.onSingleTapConfirmed(e); + } + }); + } + + protected void onResume() { + super.onResume(); + binding.mapView.resume(); + } + + @Override + protected void onPause() { + super.onPause(); + binding.mapView.pause(); + } + + private void addMarker(Point point) { + SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.RED, 10); + Graphic graphic = new Graphic(point, simpleMarkerSymbol); + GraphicsOverlay mGraphicsOverlay = new GraphicsOverlay(); + ListenableList overlayGraphics = mGraphicsOverlay.getGraphics(); + ListenableList graphicsOverlays = binding.mapView.getGraphicsOverlays(); + overlayGraphics.add(graphic); + graphicsOverlays.add(mGraphicsOverlay); + } +} diff --git a/app/src/main/java/com/casic/dcms/view/pipeline/PipelineManagerActivity.java b/app/src/main/java/com/casic/dcms/view/pipeline/PipelineManagerActivity.java index e2e6656..eac37ed 100644 --- a/app/src/main/java/com/casic/dcms/view/pipeline/PipelineManagerActivity.java +++ b/app/src/main/java/com/casic/dcms/view/pipeline/PipelineManagerActivity.java @@ -1,6 +1,7 @@ package com.casic.dcms.view.pipeline; import android.content.Context; +import android.content.Intent; import android.graphics.Color; import android.os.Bundle; import android.os.Handler; @@ -75,7 +76,13 @@ showBatchCancelDialog(); break; case 1: - ContextKit.navigatePageTo(context, WarningOnMapActivity.class); + if (dataBeans.isEmpty()) { + StringKit.show(context, "无报警数据"); + return; + } + Intent intent = new Intent(context, AlarmOnMapActivity.class); + intent.putParcelableArrayListExtra("rows_list", new ArrayList<>(dataBeans)); + context.startActivity(intent); break; case 2: ContextKit.navigatePageTo(context, WellListActivity.class); @@ -153,7 +160,7 @@ } private void getAlarmList() { - alarmViewModel.getAlarmList(this, LocaleConstant.PAGE_LIMIT, page); + alarmViewModel.getAlarmList(this, page); } @Override diff --git a/app/src/main/java/com/casic/dcms/view/pipeline/WarningOnMapActivity.java b/app/src/main/java/com/casic/dcms/view/pipeline/WarningOnMapActivity.java deleted file mode 100644 index 66a38d0..0000000 --- a/app/src/main/java/com/casic/dcms/view/pipeline/WarningOnMapActivity.java +++ /dev/null @@ -1,230 +0,0 @@ -package com.casic.dcms.view.pipeline; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.content.DialogInterface; -import android.graphics.Color; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.widget.TextView; - -import androidx.annotation.Nullable; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProvider; - -import com.casic.dcms.R; -import com.casic.dcms.databinding.ActivityMapWarningBinding; -import com.casic.dcms.model.WellAlarmListBean; -import com.casic.dcms.model.WellDetailBean; -import com.casic.dcms.utils.ArcGisMapCreator; -import com.casic.dcms.utils.LocaleConstant; -import com.casic.dcms.utils.ViewGroupKit; -import com.casic.dcms.vm.AlarmViewModel; -import com.casic.dcms.vm.WellViewModel; -import com.esri.arcgisruntime.geometry.Point; -import com.esri.arcgisruntime.mapping.ArcGISMap; -import com.esri.arcgisruntime.mapping.Basemap; -import com.esri.arcgisruntime.mapping.BasemapStyle; -import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; -import com.esri.arcgisruntime.mapping.view.Graphic; -import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; -import com.esri.arcgisruntime.symbology.SimpleMarkerSymbol; -import com.esri.arcgisruntime.util.ListenableList; -import com.pengxh.androidx.lite.base.AndroidxBaseActivity; -import com.pengxh.androidx.lite.utils.LoadState; -import com.pengxh.androidx.lite.utils.LoadingDialog; -import com.pengxh.androidx.lite.utils.SaveKeyValues; -import com.pengxh.androidx.lite.widget.TitleBarView; -import com.qmuiteam.qmui.util.QMUIDisplayHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; -import com.qmuiteam.qmui.widget.popup.QMUIPopup; -import com.qmuiteam.qmui.widget.popup.QMUIPopups; - -import java.util.ArrayList; -import java.util.List; - -public class WarningOnMapActivity extends AndroidxBaseActivity { - - private static final String TAG = "WarningOnMapActivity"; - private final Context context = this; - private final List geometryList = new ArrayList<>(); - private AlarmViewModel alarmViewModel; - private WellViewModel wellViewModel; - - @Override - protected void setupTopBarLayout() { - ViewGroupKit.initImmersionBar(binding.rootView, this, true, R.color.white); - binding.titleView.setOnClickListener(new TitleBarView.OnClickListener() { - @Override - public void onLeftClick() { - finish(); - } - - @Override - public void onRightClick() { - - } - }); - } - - @Override - protected void observeRequestState() { - alarmViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - if (loadState == LoadState.Loading) { - LoadingDialog.show(WarningOnMapActivity.this, "数据加载中,请稍后"); - } else { - LoadingDialog.dismiss(); - } - } - }); - - wellViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - - } - }); - } - - @Override - public void initOnCreate(@Nullable Bundle savedInstanceState) { - binding.mapView.setAttributionTextVisible(false);//去掉左下角属性标识 - binding.mapView.setViewpointScaleAsync(64000); - ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_STREETS); - //创建底图、并设置底图图层 - Basemap basemap = new Basemap(ArcGisMapCreator.createNoGridLayer()); - arcGISMap.setBasemap(basemap); - binding.mapView.setMap(arcGISMap); - - int alarmTotal = (int) SaveKeyValues.getValue("alarmTotal", LocaleConstant.PAGE_LIMIT); - alarmViewModel = new ViewModelProvider(this).get(AlarmViewModel.class); - alarmViewModel.wellAlarmListResult.observe(this, new Observer() { - @Override - public void onChanged(WellAlarmListBean alarmDataBean) { - if (alarmDataBean.getCode() == 200) { - List dataRows = alarmDataBean.getData().getRows(); - for (WellAlarmListBean.DataBean.RowsBean rowsBean : dataRows) { - String queryParam = "编号='" + rowsBean.getWellCode() + "'"; - wellViewModel.getWellDetail(context, queryParam); - } - } - } - }); - alarmViewModel.getAlarmList(this, alarmTotal, 1); - - wellViewModel = new ViewModelProvider(this).get(WellViewModel.class); - wellViewModel.resultModel.observe(this, new Observer() { - @Override - public void onChanged(WellDetailBean wellDetailBean) { - List features = wellDetailBean.getFeatures(); - if (features.size() > 0) { - WellDetailBean.FeaturesBean featuresBean = features.get(0); - //将获取到的井数据缓存起来 - geometryList.add(featuresBean); - WellDetailBean.FeaturesBean.GeometryBean geometryBean = featuresBean.getGeometry(); - //每获取一个点就绘制出 - addMarker(new Point(geometryBean.getX(), geometryBean.getY())); - } - } - }); - } - - @SuppressLint("ClickableViewAccessibility") - @Override - public void initEvent() { - binding.expandMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 0.5); - } - }); - binding.minusMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 2); - } - }); - - binding.mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, binding.mapView) { - @Override - public boolean onSingleTapConfirmed(MotionEvent e) { - android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); - Point clickPoint = binding.mapView.screenToLocation(screenPoint); - if (geometryList.size() > 0) { - List tempList = new ArrayList<>(); - for (WellDetailBean.FeaturesBean featuresBean : geometryList) { - WellDetailBean.FeaturesBean.GeometryBean dataBean = featuresBean.getGeometry(); - if (Math.abs(dataBean.getX() - clickPoint.getX()) <= 10 * LocaleConstant.DELTA_LNG_10 && - Math.abs(dataBean.getY() - clickPoint.getY()) <= 10 * LocaleConstant.DELTA_LNG_10) { - tempList.add(featuresBean); - } - } - if (tempList.size() > 0) { - QMUIDialog.MenuDialogBuilder menuDialogBuilder = new QMUIDialog.MenuDialogBuilder(context); - menuDialogBuilder.setTitle("请选择您要查看的窨井"); - for (WellDetailBean.FeaturesBean dataBean : tempList) { - menuDialogBuilder.addItem(dataBean.getAttributes().get编号(), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - - View popupView = LayoutInflater.from(context).inflate(R.layout.popu_well, null); - TextView wellCodeView = popupView.findViewById(R.id.wellCodeView); - TextView wellTypeView = popupView.findViewById(R.id.wellTypeView); - TextView wellPositionView = popupView.findViewById(R.id.wellPositionView); - - WellDetailBean.FeaturesBean.AttributesBean attributes = dataBean.getAttributes(); - wellCodeView.setText(attributes.get编号()); - wellTypeView.setText(attributes.get附属物名称()); - wellPositionView.setText(attributes.get所属道路()); - - QMUIPopups.popup(context, QMUIDisplayHelper.dp2px(context, 290)) - .preferredDirection(QMUIPopup.DIRECTION_BOTTOM) - .view(popupView) - .edgeProtection(QMUIDisplayHelper.dp2px(context, 20)) - .dimAmount(0.6f) - .animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER) - .onDismiss(null) - .show(binding.mapView); - } - }); - } - menuDialogBuilder.create().show(); - } - } - return super.onSingleTapConfirmed(e); - } - }); - } - - protected void onResume() { - super.onResume(); - binding.mapView.resume(); - } - - @Override - protected void onPause() { - super.onPause(); - binding.mapView.pause(); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - binding.mapView.dispose(); - } - - private void addMarker(Point point) { - SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.RED, 10); - Graphic graphic = new Graphic(point, simpleMarkerSymbol); - GraphicsOverlay mGraphicsOverlay = new GraphicsOverlay(); - ListenableList overlayGraphics = mGraphicsOverlay.getGraphics(); - ListenableList graphicsOverlays = binding.mapView.getGraphicsOverlays(); - overlayGraphics.add(graphic); - graphicsOverlays.add(mGraphicsOverlay); - } -} diff --git a/app/src/main/java/com/casic/dcms/vm/AlarmViewModel.java b/app/src/main/java/com/casic/dcms/vm/AlarmViewModel.java index 1e5dabd..e08affa 100644 --- a/app/src/main/java/com/casic/dcms/vm/AlarmViewModel.java +++ b/app/src/main/java/com/casic/dcms/vm/AlarmViewModel.java @@ -25,9 +25,9 @@ public MutableLiveData wellAlarmListResult = new MutableLiveData<>(); public MutableLiveData cancelActionModel = new MutableLiveData<>(); - public void getAlarmList(Context context, int limit, int offset) { + public void getAlarmList(Context context, int offset) { loadState.setValue(LoadState.Loading); - Observable alarmListObservable = RetrofitServiceManager.getAlarmList(limit, offset); + Observable alarmListObservable = RetrofitServiceManager.getAlarmList(offset); ObserverSubscriber.addSubscribe(alarmListObservable, new ObserverSubscriber.OnObserverCallback() { @Override public void onCompleted() { diff --git a/app/src/main/res/layout/activity_map_alarm.xml b/app/src/main/res/layout/activity_map_alarm.xml new file mode 100644 index 0000000..4887af9 --- /dev/null +++ b/app/src/main/res/layout/activity_map_alarm.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_map_warning.xml b/app/src/main/res/layout/activity_map_warning.xml deleted file mode 100644 index 4887af9..0000000 --- a/app/src/main/res/layout/activity_map_warning.xml +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/item_package_rv.xml b/app/src/main/res/layout/item_package_rv.xml deleted file mode 100644 index f6f1a1b..0000000 --- a/app/src/main/res/layout/item_package_rv.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/item_package_rv_l.xml b/app/src/main/res/layout/item_package_rv_l.xml new file mode 100644 index 0000000..f6f1a1b --- /dev/null +++ b/app/src/main/res/layout/item_package_rv_l.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.gitignore b/.gitignore index f0f71e2..ee6b213 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,12 @@ *.iml .gradle /local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml +/.idea .DS_Store /build /captures .externalNativeBuild .cxx .idea +*.apk +*.json diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fdb7255..6873489 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -109,7 +109,7 @@ - + diff --git a/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java b/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java index 2dcdc64..0364fc7 100644 --- a/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java +++ b/app/src/main/java/com/casic/dcms/adapter/PackageCaseListAdapter.java @@ -9,6 +9,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; @@ -25,7 +26,6 @@ private final Context context; private final List dataRows; private final LayoutInflater layoutInflater; - private PunishTypeAdapter adapter; public PackageCaseListAdapter(Context context, List dataRows) { this.context = context; @@ -36,7 +36,7 @@ @NonNull @Override public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new ItemViewHolder(layoutInflater.inflate(R.layout.item_package_rv, parent, false)); + return new ItemViewHolder(layoutInflater.inflate(R.layout.item_package_rv_l, parent, false)); } @Override @@ -57,16 +57,67 @@ return dataRows.size(); } - @SuppressLint("NotifyDataSetChanged") - public void refresh(List dataRows) { - this.dataRows.clear(); - this.dataRows.addAll(dataRows); - notifyDataSetChanged(); + public void refresh(List newRows) { + DiffUtil.Callback diffCallback = new DiffUtil.Callback() { + + @Override + public int getOldListSize() { + return dataRows.size(); + } + + @Override + public int getNewListSize() { + return newRows.size(); + } + + @Override + public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { + if (dataRows == null || newRows == null) { + return false; + } + + // 检查索引是否在有效范围内 + if (oldItemPosition < 0 || oldItemPosition >= dataRows.size() || + newItemPosition < 0 || newItemPosition >= newRows.size()) { + return false; + } + + // 获取元素并进行比较 + Object oldItem = dataRows.get(oldItemPosition); + Object newItem = newRows.get(newItemPosition); + + // 处理空指针情况 + if (oldItem == null && newItem == null) { + return true; + } + if (oldItem == null || newItem == null) { + return false; + } + + return oldItem.equals(newItem); + } + + @Override + public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { + return dataRows.get(oldItemPosition) == newRows.get(newItemPosition); + } + }; + + DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallback); + + dataRows.clear(); + dataRows.addAll(newRows); + + diffResult.dispatchUpdatesTo(this); } - public void loadMore(List dataRows) { - this.dataRows.addAll(dataRows); - notifyItemRangeInserted(this.dataRows.size(), dataRows.size()); + public void loadMore(List newRows) { + if (newRows.isEmpty()) { + return; + } + int startPosition = this.dataRows.size(); + this.dataRows.addAll(newRows); + notifyItemRangeInserted(startPosition, newRows.size()); } class ItemViewHolder extends RecyclerView.ViewHolder { @@ -84,7 +135,6 @@ casePunishView = itemView.findViewById(R.id.casePunishView); } - void bindView(PackageCaseBean.DataBean.RowsBean rowsBean) { //三包核实图片 String fileIdVerify = rowsBean.getFileIdVerify(); @@ -97,45 +147,6 @@ } caseTitleView.setText(rowsBean.getDescription()); caseDateView.setText("上报时间:" + rowsBean.getReportTime()); -// HttpRequestHelper.doRequest(LocaleConstant.SHOP_PUNISH_LIST, rowsBean.getShopId(), new IHttpRequestListener() { -// @Override -// public void onSuccess(ResponseBody resultBean) { -// try { -// PunishTypeBean punishTypeBean = gson.fromJson(resultBean.string(), PunishTypeBean.class); -// if (punishTypeBean.getData().size() != 0) { -// //获取商铺处罚次数 -// HttpRequestHelper.doRequest(LocaleConstant.SHOP_PUNISH_TYPE, rowsBean.getShopId(), new IHttpRequestListener() { -// @Override -// public void onSuccess(ResponseBody resultBean) { -// try { -// PunishTimesBean punishTimesBean = gson.fromJson(resultBean.string(), PunishTimesBean.class); -// -// adapter = new PunishTypeAdapter(context, punishTypeBean.getData(), punishTimesBean.getData()); -// LinearLayoutManager layoutManager = new LinearLayoutManager(context); -// layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); -// punishRecyclerView.setLayoutManager(layoutManager); -// punishRecyclerView.setAdapter(adapter); -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } -// -// @Override -// public void onFailure(Throwable throwable) { -// -// } -// }); -// } -// } catch (IOException e) { -// e.printStackTrace(); -// } -// } -// -// @Override -// public void onFailure(Throwable throwable) { -// -// } -// }); } } diff --git a/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java b/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java deleted file mode 100644 index 2e178e5..0000000 --- a/app/src/main/java/com/casic/dcms/adapter/PunishTypeAdapter.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.casic.dcms.adapter; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.core.content.ContextCompat; -import androidx.recyclerview.widget.RecyclerView; - -import com.casic.dcms.R; -import com.casic.dcms.model.PunishTimesBean; -import com.casic.dcms.model.PunishTypeBean; - -import java.util.List; - -@SuppressLint("SetTextI18n") -public class PunishTypeAdapter extends RecyclerView.Adapter { - - private final Context context; - private final List dataRows; - private final PunishTimesBean.DataBean dataBean; - private final LayoutInflater layoutInflater; - - PunishTypeAdapter(Context context, List dataRows, PunishTimesBean.DataBean dataBean) { - this.context = context; - this.dataRows = dataRows; - this.dataBean = dataBean; - this.layoutInflater = LayoutInflater.from(context); - } - - @NonNull - @Override - public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - return new ItemViewHolder(layoutInflater.inflate(R.layout.item_punish_recycleview, parent, false)); - } - - @Override - public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { - String typeName = dataRows.get(position).getPunishTypeName(); - int color, times; - switch (typeName) { - case "劝导": - times = dataBean.getPersuade(); - color = ContextCompat.getColor(context, R.color.persuadeColor); - break; - case "警告": - times = dataBean.getWarn(); - color = ContextCompat.getColor(context, R.color.warnColor); - break; - case "处罚": - times = dataBean.getPunish(); - color = ContextCompat.getColor(context, R.color.punishColor); - break; - default: - times = 0; - color = ContextCompat.getColor(context, R.color.mainThemeColor); - break; - } - if (times == 0) { - holder.punishTypeView.setVisibility(View.GONE); - } else { - holder.punishTypeView.setText(typeName + " x " + times); - holder.punishTypeView.setBackgroundColor(color); - } - } - - @Override - public int getItemCount() { - return dataRows.size(); - } - - static class ItemViewHolder extends RecyclerView.ViewHolder { - - private final TextView punishTypeView; - - ItemViewHolder(@NonNull View itemView) { - super(itemView); - punishTypeView = itemView.findViewById(R.id.punishTypeView); - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java b/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java deleted file mode 100644 index dc57ca3..0000000 --- a/app/src/main/java/com/casic/dcms/model/PunishTimesBean.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.casic.dcms.model; - -public class PunishTimesBean { - 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 { - /** - * warn : 0 - * punish : 0 - * persuade : 0 - */ - - private int warn; - private int punish; - private int persuade; - - public int getWarn() { - return warn; - } - - public void setWarn(int warn) { - this.warn = warn; - } - - public int getPunish() { - return punish; - } - - public void setPunish(int punish) { - this.punish = punish; - } - - public int getPersuade() { - return persuade; - } - - public void setPersuade(int persuade) { - this.persuade = persuade; - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java b/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java deleted file mode 100644 index 00b6a98..0000000 --- a/app/src/main/java/com/casic/dcms/model/PunishTypeBean.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.casic.dcms.model; - -import java.util.List; - -public class PunishTypeBean { - private int code; - private String message; - private boolean success; - private List data; - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - 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 List getData() { - return data; - } - - public void setData(List data) { - this.data = data; - } - - public static class DataBean { - /** - * punishTime : 2021-01-12 09:08:59 - * punishTypeName : 处罚 - * punishImage : images - * punishType : 1 - * punishRemarks : 处罚 - */ - - private String punishTime; - private String punishTypeName; - private String punishImage; - private String punishType; - private String punishRemarks; - - public String getPunishTime() { - return punishTime; - } - - public void setPunishTime(String punishTime) { - this.punishTime = punishTime; - } - - public String getPunishTypeName() { - return punishTypeName; - } - - public void setPunishTypeName(String punishTypeName) { - this.punishTypeName = punishTypeName; - } - - public String getPunishImage() { - return punishImage; - } - - public void setPunishImage(String punishImage) { - this.punishImage = punishImage; - } - - public String getPunishType() { - return punishType; - } - - public void setPunishType(String punishType) { - this.punishType = punishType; - } - - public String getPunishRemarks() { - return punishRemarks; - } - - public void setPunishRemarks(String punishRemarks) { - this.punishRemarks = punishRemarks; - } - } -} diff --git a/app/src/main/java/com/casic/dcms/model/UnitFeatureBean.java b/app/src/main/java/com/casic/dcms/model/UnitFeatureBean.java deleted file mode 100644 index a4d8337..0000000 --- a/app/src/main/java/com/casic/dcms/model/UnitFeatureBean.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.casic.dcms.model; - -public class UnitFeatureBean { - - private String BGID; - private String BGNAME; - private int OBJECTID; - - public String getBGID() { - return BGID; - } - - public void setBGID(String BGID) { - this.BGID = BGID; - } - - public String getBGNAME() { - return BGNAME; - } - - public void setBGNAME(String BGNAME) { - this.BGNAME = BGNAME; - } - - public int getOBJECTID() { - return OBJECTID; - } - - public void setOBJECTID(int OBJECTID) { - this.OBJECTID = OBJECTID; - } -} diff --git a/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java b/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java index 0578f7b..b0c24d5 100644 --- a/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java +++ b/app/src/main/java/com/casic/dcms/model/WellAlarmListBean.java @@ -1,9 +1,16 @@ package com.casic.dcms.model; +import android.os.Parcel; +import android.os.Parcelable; + +import androidx.annotation.NonNull; + import java.util.List; -public class WellAlarmListBean { - +/** + * Parcelable 是 Android 平台专门为性能优化而设计的序列化机制,通常比 Serializable 快 10 倍左右 + */ +public class WellAlarmListBean implements Parcelable { private int code; private DataBean data; private String message; @@ -41,7 +48,43 @@ this.success = success; } - public static class DataBean { + public WellAlarmListBean() { + + } + + protected WellAlarmListBean(Parcel in) { + code = in.readInt(); + data = in.readParcelable(DataBean.class.getClassLoader()); + message = in.readString(); + success = in.readByte() != 0; + } + + public static final Creator CREATOR = new Creator() { + @Override + public WellAlarmListBean createFromParcel(Parcel in) { + return new WellAlarmListBean(in); + } + + @Override + public WellAlarmListBean[] newArray(int size) { + return new WellAlarmListBean[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + dest.writeInt(code); + dest.writeParcelable(data, flags); + dest.writeString(message); + dest.writeByte((byte) (success ? 1 : 0)); + } + + public static class DataBean implements Parcelable { private int total; private List rows; @@ -62,7 +105,38 @@ this.rows = rows; } - public static class RowsBean { + public DataBean() { + } + + protected DataBean(Parcel in) { + total = in.readInt(); + rows = in.createTypedArrayList(RowsBean.CREATOR); + } + + public static final Creator CREATOR = new Creator() { + @Override + public DataBean createFromParcel(Parcel in) { + return new DataBean(in); + } + + @Override + public DataBean[] newArray(int size) { + return new DataBean[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(total); + dest.writeTypedList(rows); + } + + public static class RowsBean implements Parcelable { /** * alarmContent : 1 * deptName : 崇仁县城管局 @@ -296,6 +370,79 @@ public void setStatus(String status) { this.status = status; } + + public RowsBean() { + } + + protected RowsBean(Parcel in) { + alarmContent = in.readInt(); + deptName = in.readString(); + jobStatus = in.readString(); + alarmContentName = in.readString(); + wellCode = in.readString(); + alarmTime = in.readString(); + deptid = in.readString(); + alarmTypeName = in.readString(); + alarmMessage = in.readString(); + staff = in.readString(); + deviceId = in.readString(); + jobId = in.readString(); + jobStatusName = in.readString(); + alarmType = in.readString(); + alarmValue = in.readString(); + devcode = in.readString(); + statusName = in.readString(); + alarmLevel = in.readString(); + tel = in.readString(); + id = in.readString(); + wellId = in.readString(); + position = in.readString(); + status = in.readString(); + } + + public static final Creator CREATOR = new Creator() { + @Override + public RowsBean createFromParcel(Parcel in) { + return new RowsBean(in); + } + + @Override + public RowsBean[] newArray(int size) { + return new RowsBean[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(alarmContent); + dest.writeString(deptName); + dest.writeString(jobStatus); + dest.writeString(alarmContentName); + dest.writeString(wellCode); + dest.writeString(alarmTime); + dest.writeString(deptid); + dest.writeString(alarmTypeName); + dest.writeString(alarmMessage); + dest.writeString(staff); + dest.writeString(deviceId); + dest.writeString(jobId); + dest.writeString(jobStatusName); + dest.writeString(alarmType); + dest.writeString(alarmValue); + dest.writeString(devcode); + dest.writeString(statusName); + dest.writeString(alarmLevel); + dest.writeString(tel); + dest.writeString(id); + dest.writeString(wellId); + dest.writeString(position); + dest.writeString(status); + } } } } diff --git a/app/src/main/java/com/casic/dcms/model/WellDetailBean.java b/app/src/main/java/com/casic/dcms/model/WellDetailBean.java index cea8774..4e6c8fd 100644 --- a/app/src/main/java/com/casic/dcms/model/WellDetailBean.java +++ b/app/src/main/java/com/casic/dcms/model/WellDetailBean.java @@ -60,7 +60,6 @@ } public static class FieldAliasesBean { - private String objectid; private String 编号; private String 附属物编码; @@ -190,7 +189,6 @@ } public static class SpatialReferenceBean { - private int wkid; private int latestWkid; @@ -212,7 +210,6 @@ } public static class FieldsBean { - private String name; private String type; private String alias; @@ -252,7 +249,6 @@ } public static class FeaturesBean { - private AttributesBean attributes; private GeometryBean geometry; diff --git a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java index 8b15d77..6f1d941 100644 --- a/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java +++ b/app/src/main/java/com/casic/dcms/utils/retrofit/RetrofitServiceManager.java @@ -621,8 +621,8 @@ /** * 报警列表 */ - public static Observable getAlarmList(int limit, int offset) { - return api.getAlarmList(AuthenticationHelper.getToken(), "1", limit, offset); + public static Observable getAlarmList(int offset) { + return api.getAlarmList(AuthenticationHelper.getToken(), "1", LocaleConstant.PAGE_LIMIT, offset); } /** @@ -662,18 +662,15 @@ return api.optionWellStatus(AuthenticationHelper.getToken(), bfzt); } + private static final RetrofitService arcgisApi = RetrofitFactory.createRetrofit( + "http://111.198.10.15:13002", RetrofitService.class, true + ); + /** * 报警窨井详情 */ public static Observable getWellDetailResult(String where) { -// Retrofit retrofit = new Retrofit.Builder() -// .baseUrl("http://111.198.10.15:13002") -// .addConverterFactory(GsonConverterFactory.create())//Gson转换器 -// .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) -// .client(createOKHttpClient())//log拦截器 -// .build(); -// RetrofitService service = retrofit.create(RetrofitService.class); - return api.getWellDetail( + return arcgisApi.getWellDetail( "json", "4326", "4326", "*", true, where ); } diff --git a/app/src/main/java/com/casic/dcms/view/pipeline/AlarmOnMapActivity.java b/app/src/main/java/com/casic/dcms/view/pipeline/AlarmOnMapActivity.java new file mode 100644 index 0000000..e3dc01d --- /dev/null +++ b/app/src/main/java/com/casic/dcms/view/pipeline/AlarmOnMapActivity.java @@ -0,0 +1,212 @@ +package com.casic.dcms.view.pipeline; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.DialogInterface; +import android.graphics.Color; +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; + +import com.casic.dcms.R; +import com.casic.dcms.databinding.ActivityMapAlarmBinding; +import com.casic.dcms.model.WellAlarmListBean; +import com.casic.dcms.model.WellDetailBean; +import com.casic.dcms.utils.ArcGisMapCreator; +import com.casic.dcms.utils.LocaleConstant; +import com.casic.dcms.utils.ViewGroupKit; +import com.casic.dcms.vm.WellViewModel; +import com.esri.arcgisruntime.geometry.Point; +import com.esri.arcgisruntime.mapping.ArcGISMap; +import com.esri.arcgisruntime.mapping.Basemap; +import com.esri.arcgisruntime.mapping.BasemapStyle; +import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; +import com.esri.arcgisruntime.mapping.view.Graphic; +import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; +import com.esri.arcgisruntime.symbology.SimpleMarkerSymbol; +import com.esri.arcgisruntime.util.ListenableList; +import com.pengxh.androidx.lite.base.AndroidxBaseActivity; +import com.pengxh.androidx.lite.utils.LoadState; +import com.pengxh.androidx.lite.utils.LoadingDialog; +import com.pengxh.androidx.lite.widget.TitleBarView; +import com.qmuiteam.qmui.util.QMUIDisplayHelper; +import com.qmuiteam.qmui.widget.dialog.QMUIDialog; +import com.qmuiteam.qmui.widget.popup.QMUIPopup; +import com.qmuiteam.qmui.widget.popup.QMUIPopups; + +import java.util.ArrayList; +import java.util.List; + +public class AlarmOnMapActivity extends AndroidxBaseActivity { + + private static final String TAG = "AlarmOnMapActivity"; + private final Context context = this; + private final List geometryList = new ArrayList<>(); + private WellViewModel wellViewModel; + + @Override + protected void setupTopBarLayout() { + ViewGroupKit.initImmersionBar(binding.rootView, this, true, R.color.white); + binding.titleView.setOnClickListener(new TitleBarView.OnClickListener() { + @Override + public void onLeftClick() { + finish(); + } + + @Override + public void onRightClick() { + + } + }); + } + + @Override + protected void observeRequestState() { + wellViewModel.loadState.observe(this, new Observer() { + @Override + public void onChanged(LoadState loadState) { + if (loadState == LoadState.Loading) { + LoadingDialog.show(AlarmOnMapActivity.this, "数据加载中,请稍后"); + } else { + LoadingDialog.dismiss(); + } + } + }); + } + + @Override + public void initOnCreate(@Nullable Bundle savedInstanceState) { + binding.mapView.setAttributionTextVisible(false);//去掉左下角属性标识 + binding.mapView.setViewpointScaleAsync(64000); + ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_STREETS); + //创建底图、并设置底图图层 + Basemap basemap = new Basemap(ArcGisMapCreator.createNoGridLayer()); + arcGISMap.setBasemap(basemap); + binding.mapView.setMap(arcGISMap); + + wellViewModel = new ViewModelProvider(this).get(WellViewModel.class); + wellViewModel.resultModel.observe(this, new Observer() { + @Override + public void onChanged(WellDetailBean wellDetailBean) { + List features = wellDetailBean.getFeatures(); + if (features.size() > 0) { + WellDetailBean.FeaturesBean featuresBean = features.get(0); + //将获取到的井数据缓存起来 + geometryList.add(featuresBean); + WellDetailBean.FeaturesBean.GeometryBean geometryBean = featuresBean.getGeometry(); + //每获取一个点就绘制出 + addMarker(new Point(geometryBean.getX(), geometryBean.getY())); + } + } + }); + + Bundle extras = getIntent().getExtras(); + if (extras != null) { + List dataBeans = extras.getParcelableArrayList("rows_list"); + if (dataBeans == null) { + return; + } + for (WellAlarmListBean.DataBean.RowsBean dataBean : dataBeans) { + String queryParam = "编号='" + dataBean.getWellCode() + "'"; + Log.d(TAG, "queryParam: " + queryParam); + wellViewModel.getWellDetail(context, queryParam); + } + } + } + + @SuppressLint("ClickableViewAccessibility") + @Override + public void initEvent() { + binding.expandMapView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 0.5); + } + }); + binding.minusMapView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 2); + } + }); + + binding.mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, binding.mapView) { + @Override + public boolean onSingleTapConfirmed(MotionEvent e) { + android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); + Point clickPoint = binding.mapView.screenToLocation(screenPoint); + if (geometryList.size() > 0) { + List tempList = new ArrayList<>(); + for (WellDetailBean.FeaturesBean featuresBean : geometryList) { + WellDetailBean.FeaturesBean.GeometryBean dataBean = featuresBean.getGeometry(); + if (Math.abs(dataBean.getX() - clickPoint.getX()) <= 10 * LocaleConstant.DELTA_LNG_10 && + Math.abs(dataBean.getY() - clickPoint.getY()) <= 10 * LocaleConstant.DELTA_LNG_10) { + tempList.add(featuresBean); + } + } + if (tempList.size() > 0) { + QMUIDialog.MenuDialogBuilder menuDialogBuilder = new QMUIDialog.MenuDialogBuilder(context); + menuDialogBuilder.setTitle("请选择您要查看的窨井"); + for (WellDetailBean.FeaturesBean dataBean : tempList) { + menuDialogBuilder.addItem(dataBean.getAttributes().get编号(), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + dialog.dismiss(); + + View popupView = LayoutInflater.from(context).inflate(R.layout.popu_well, null); + TextView wellCodeView = popupView.findViewById(R.id.wellCodeView); + TextView wellTypeView = popupView.findViewById(R.id.wellTypeView); + TextView wellPositionView = popupView.findViewById(R.id.wellPositionView); + + WellDetailBean.FeaturesBean.AttributesBean attributes = dataBean.getAttributes(); + wellCodeView.setText(attributes.get编号()); + wellTypeView.setText(attributes.get附属物名称()); + wellPositionView.setText(attributes.get所属道路()); + + QMUIPopups.popup(context, QMUIDisplayHelper.dp2px(context, 290)) + .preferredDirection(QMUIPopup.DIRECTION_BOTTOM) + .view(popupView) + .edgeProtection(QMUIDisplayHelper.dp2px(context, 20)) + .dimAmount(0.6f) + .animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER) + .onDismiss(null) + .show(binding.mapView); + } + }); + } + menuDialogBuilder.create().show(); + } + } + return super.onSingleTapConfirmed(e); + } + }); + } + + protected void onResume() { + super.onResume(); + binding.mapView.resume(); + } + + @Override + protected void onPause() { + super.onPause(); + binding.mapView.pause(); + } + + private void addMarker(Point point) { + SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.RED, 10); + Graphic graphic = new Graphic(point, simpleMarkerSymbol); + GraphicsOverlay mGraphicsOverlay = new GraphicsOverlay(); + ListenableList overlayGraphics = mGraphicsOverlay.getGraphics(); + ListenableList graphicsOverlays = binding.mapView.getGraphicsOverlays(); + overlayGraphics.add(graphic); + graphicsOverlays.add(mGraphicsOverlay); + } +} diff --git a/app/src/main/java/com/casic/dcms/view/pipeline/PipelineManagerActivity.java b/app/src/main/java/com/casic/dcms/view/pipeline/PipelineManagerActivity.java index e2e6656..eac37ed 100644 --- a/app/src/main/java/com/casic/dcms/view/pipeline/PipelineManagerActivity.java +++ b/app/src/main/java/com/casic/dcms/view/pipeline/PipelineManagerActivity.java @@ -1,6 +1,7 @@ package com.casic.dcms.view.pipeline; import android.content.Context; +import android.content.Intent; import android.graphics.Color; import android.os.Bundle; import android.os.Handler; @@ -75,7 +76,13 @@ showBatchCancelDialog(); break; case 1: - ContextKit.navigatePageTo(context, WarningOnMapActivity.class); + if (dataBeans.isEmpty()) { + StringKit.show(context, "无报警数据"); + return; + } + Intent intent = new Intent(context, AlarmOnMapActivity.class); + intent.putParcelableArrayListExtra("rows_list", new ArrayList<>(dataBeans)); + context.startActivity(intent); break; case 2: ContextKit.navigatePageTo(context, WellListActivity.class); @@ -153,7 +160,7 @@ } private void getAlarmList() { - alarmViewModel.getAlarmList(this, LocaleConstant.PAGE_LIMIT, page); + alarmViewModel.getAlarmList(this, page); } @Override diff --git a/app/src/main/java/com/casic/dcms/view/pipeline/WarningOnMapActivity.java b/app/src/main/java/com/casic/dcms/view/pipeline/WarningOnMapActivity.java deleted file mode 100644 index 66a38d0..0000000 --- a/app/src/main/java/com/casic/dcms/view/pipeline/WarningOnMapActivity.java +++ /dev/null @@ -1,230 +0,0 @@ -package com.casic.dcms.view.pipeline; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.content.DialogInterface; -import android.graphics.Color; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.widget.TextView; - -import androidx.annotation.Nullable; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProvider; - -import com.casic.dcms.R; -import com.casic.dcms.databinding.ActivityMapWarningBinding; -import com.casic.dcms.model.WellAlarmListBean; -import com.casic.dcms.model.WellDetailBean; -import com.casic.dcms.utils.ArcGisMapCreator; -import com.casic.dcms.utils.LocaleConstant; -import com.casic.dcms.utils.ViewGroupKit; -import com.casic.dcms.vm.AlarmViewModel; -import com.casic.dcms.vm.WellViewModel; -import com.esri.arcgisruntime.geometry.Point; -import com.esri.arcgisruntime.mapping.ArcGISMap; -import com.esri.arcgisruntime.mapping.Basemap; -import com.esri.arcgisruntime.mapping.BasemapStyle; -import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; -import com.esri.arcgisruntime.mapping.view.Graphic; -import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; -import com.esri.arcgisruntime.symbology.SimpleMarkerSymbol; -import com.esri.arcgisruntime.util.ListenableList; -import com.pengxh.androidx.lite.base.AndroidxBaseActivity; -import com.pengxh.androidx.lite.utils.LoadState; -import com.pengxh.androidx.lite.utils.LoadingDialog; -import com.pengxh.androidx.lite.utils.SaveKeyValues; -import com.pengxh.androidx.lite.widget.TitleBarView; -import com.qmuiteam.qmui.util.QMUIDisplayHelper; -import com.qmuiteam.qmui.widget.dialog.QMUIDialog; -import com.qmuiteam.qmui.widget.popup.QMUIPopup; -import com.qmuiteam.qmui.widget.popup.QMUIPopups; - -import java.util.ArrayList; -import java.util.List; - -public class WarningOnMapActivity extends AndroidxBaseActivity { - - private static final String TAG = "WarningOnMapActivity"; - private final Context context = this; - private final List geometryList = new ArrayList<>(); - private AlarmViewModel alarmViewModel; - private WellViewModel wellViewModel; - - @Override - protected void setupTopBarLayout() { - ViewGroupKit.initImmersionBar(binding.rootView, this, true, R.color.white); - binding.titleView.setOnClickListener(new TitleBarView.OnClickListener() { - @Override - public void onLeftClick() { - finish(); - } - - @Override - public void onRightClick() { - - } - }); - } - - @Override - protected void observeRequestState() { - alarmViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - if (loadState == LoadState.Loading) { - LoadingDialog.show(WarningOnMapActivity.this, "数据加载中,请稍后"); - } else { - LoadingDialog.dismiss(); - } - } - }); - - wellViewModel.loadState.observe(this, new Observer() { - @Override - public void onChanged(LoadState loadState) { - - } - }); - } - - @Override - public void initOnCreate(@Nullable Bundle savedInstanceState) { - binding.mapView.setAttributionTextVisible(false);//去掉左下角属性标识 - binding.mapView.setViewpointScaleAsync(64000); - ArcGISMap arcGISMap = new ArcGISMap(BasemapStyle.ARCGIS_STREETS); - //创建底图、并设置底图图层 - Basemap basemap = new Basemap(ArcGisMapCreator.createNoGridLayer()); - arcGISMap.setBasemap(basemap); - binding.mapView.setMap(arcGISMap); - - int alarmTotal = (int) SaveKeyValues.getValue("alarmTotal", LocaleConstant.PAGE_LIMIT); - alarmViewModel = new ViewModelProvider(this).get(AlarmViewModel.class); - alarmViewModel.wellAlarmListResult.observe(this, new Observer() { - @Override - public void onChanged(WellAlarmListBean alarmDataBean) { - if (alarmDataBean.getCode() == 200) { - List dataRows = alarmDataBean.getData().getRows(); - for (WellAlarmListBean.DataBean.RowsBean rowsBean : dataRows) { - String queryParam = "编号='" + rowsBean.getWellCode() + "'"; - wellViewModel.getWellDetail(context, queryParam); - } - } - } - }); - alarmViewModel.getAlarmList(this, alarmTotal, 1); - - wellViewModel = new ViewModelProvider(this).get(WellViewModel.class); - wellViewModel.resultModel.observe(this, new Observer() { - @Override - public void onChanged(WellDetailBean wellDetailBean) { - List features = wellDetailBean.getFeatures(); - if (features.size() > 0) { - WellDetailBean.FeaturesBean featuresBean = features.get(0); - //将获取到的井数据缓存起来 - geometryList.add(featuresBean); - WellDetailBean.FeaturesBean.GeometryBean geometryBean = featuresBean.getGeometry(); - //每获取一个点就绘制出 - addMarker(new Point(geometryBean.getX(), geometryBean.getY())); - } - } - }); - } - - @SuppressLint("ClickableViewAccessibility") - @Override - public void initEvent() { - binding.expandMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 0.5); - } - }); - binding.minusMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - binding.mapView.setViewpointScaleAsync(binding.mapView.getMapScale() * 2); - } - }); - - binding.mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, binding.mapView) { - @Override - public boolean onSingleTapConfirmed(MotionEvent e) { - android.graphics.Point screenPoint = new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())); - Point clickPoint = binding.mapView.screenToLocation(screenPoint); - if (geometryList.size() > 0) { - List tempList = new ArrayList<>(); - for (WellDetailBean.FeaturesBean featuresBean : geometryList) { - WellDetailBean.FeaturesBean.GeometryBean dataBean = featuresBean.getGeometry(); - if (Math.abs(dataBean.getX() - clickPoint.getX()) <= 10 * LocaleConstant.DELTA_LNG_10 && - Math.abs(dataBean.getY() - clickPoint.getY()) <= 10 * LocaleConstant.DELTA_LNG_10) { - tempList.add(featuresBean); - } - } - if (tempList.size() > 0) { - QMUIDialog.MenuDialogBuilder menuDialogBuilder = new QMUIDialog.MenuDialogBuilder(context); - menuDialogBuilder.setTitle("请选择您要查看的窨井"); - for (WellDetailBean.FeaturesBean dataBean : tempList) { - menuDialogBuilder.addItem(dataBean.getAttributes().get编号(), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.dismiss(); - - View popupView = LayoutInflater.from(context).inflate(R.layout.popu_well, null); - TextView wellCodeView = popupView.findViewById(R.id.wellCodeView); - TextView wellTypeView = popupView.findViewById(R.id.wellTypeView); - TextView wellPositionView = popupView.findViewById(R.id.wellPositionView); - - WellDetailBean.FeaturesBean.AttributesBean attributes = dataBean.getAttributes(); - wellCodeView.setText(attributes.get编号()); - wellTypeView.setText(attributes.get附属物名称()); - wellPositionView.setText(attributes.get所属道路()); - - QMUIPopups.popup(context, QMUIDisplayHelper.dp2px(context, 290)) - .preferredDirection(QMUIPopup.DIRECTION_BOTTOM) - .view(popupView) - .edgeProtection(QMUIDisplayHelper.dp2px(context, 20)) - .dimAmount(0.6f) - .animStyle(QMUIPopup.ANIM_GROW_FROM_CENTER) - .onDismiss(null) - .show(binding.mapView); - } - }); - } - menuDialogBuilder.create().show(); - } - } - return super.onSingleTapConfirmed(e); - } - }); - } - - protected void onResume() { - super.onResume(); - binding.mapView.resume(); - } - - @Override - protected void onPause() { - super.onPause(); - binding.mapView.pause(); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - binding.mapView.dispose(); - } - - private void addMarker(Point point) { - SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.RED, 10); - Graphic graphic = new Graphic(point, simpleMarkerSymbol); - GraphicsOverlay mGraphicsOverlay = new GraphicsOverlay(); - ListenableList overlayGraphics = mGraphicsOverlay.getGraphics(); - ListenableList graphicsOverlays = binding.mapView.getGraphicsOverlays(); - overlayGraphics.add(graphic); - graphicsOverlays.add(mGraphicsOverlay); - } -} diff --git a/app/src/main/java/com/casic/dcms/vm/AlarmViewModel.java b/app/src/main/java/com/casic/dcms/vm/AlarmViewModel.java index 1e5dabd..e08affa 100644 --- a/app/src/main/java/com/casic/dcms/vm/AlarmViewModel.java +++ b/app/src/main/java/com/casic/dcms/vm/AlarmViewModel.java @@ -25,9 +25,9 @@ public MutableLiveData wellAlarmListResult = new MutableLiveData<>(); public MutableLiveData cancelActionModel = new MutableLiveData<>(); - public void getAlarmList(Context context, int limit, int offset) { + public void getAlarmList(Context context, int offset) { loadState.setValue(LoadState.Loading); - Observable alarmListObservable = RetrofitServiceManager.getAlarmList(limit, offset); + Observable alarmListObservable = RetrofitServiceManager.getAlarmList(offset); ObserverSubscriber.addSubscribe(alarmListObservable, new ObserverSubscriber.OnObserverCallback() { @Override public void onCompleted() { diff --git a/app/src/main/res/layout/activity_map_alarm.xml b/app/src/main/res/layout/activity_map_alarm.xml new file mode 100644 index 0000000..4887af9 --- /dev/null +++ b/app/src/main/res/layout/activity_map_alarm.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_map_warning.xml b/app/src/main/res/layout/activity_map_warning.xml deleted file mode 100644 index 4887af9..0000000 --- a/app/src/main/res/layout/activity_map_warning.xml +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/item_package_rv.xml b/app/src/main/res/layout/item_package_rv.xml deleted file mode 100644 index f6f1a1b..0000000 --- a/app/src/main/res/layout/item_package_rv.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/item_package_rv_l.xml b/app/src/main/res/layout/item_package_rv_l.xml new file mode 100644 index 0000000..f6f1a1b --- /dev/null +++ b/app/src/main/res/layout/item_package_rv_l.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_punish_recycleview.xml b/app/src/main/res/layout/item_punish_recycleview.xml deleted file mode 100644 index 2f66521..0000000 --- a/app/src/main/res/layout/item_punish_recycleview.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - \ No newline at end of file