app/build.gradle
@@ -12,7 +12,7 @@ } } namespace 'com.dayu.pipirrapp' compileSdk 33 compileSdk 34 defaultConfig { applicationId "com.dayu.pipirrapp" @@ -189,12 +189,14 @@ implementation 'io.github.lucksiege:compress:v3.11.2' // 图片查看 implementation('com.github.SherlockGougou:BigImageViewPager:androidx-7.2.3') { implementation('com.github.SherlockGougou:BigImageViewPager:androidx-8.0.0') { exclude group: 'androidx.appcompat'; exclude group: 'com.google.android.material'; exclude group: 'androidx.core'; } implementation "androidx.media3:media3-exoplayer:1.4.1" implementation "androidx.media3:media3-exoplayer-dash:1.4.1" implementation "androidx.media3:media3-ui:1.4.1" //进度加载 implementation 'com.github.jenly1314:circleprogressview:1.1.3' app/src/main/java/com/dayu/pipirrapp/activity/IssueDetailActivity.java
@@ -13,8 +13,10 @@ import com.dayu.pipirrapp.MyApplication; import com.dayu.pipirrapp.R; import com.dayu.pipirrapp.adapter.ImageAdapter; import com.dayu.pipirrapp.bean.ImageBean; import com.dayu.pipirrapp.bean.net.ImageResult; import com.dayu.pipirrapp.bean.net.IssueResult; import com.dayu.pipirrapp.bean.net.UplodFileState; import com.dayu.pipirrapp.databinding.ActivityIssueDetailBinding; import com.dayu.pipirrapp.fragment.OrderFragment; import com.dayu.pipirrapp.net.ApiManager; @@ -34,6 +36,8 @@ import java.util.Map; import cc.shinichi.library.ImagePreview; import cc.shinichi.library.bean.ImageInfo; import cc.shinichi.library.bean.Type; /** * IssueDetailActivity - 问题上报详情界面 @@ -47,8 +51,8 @@ RecyclerView mRecyclerView; ActivityIssueDetailBinding binding; ImageAdapter mAdapter; List<String> imageInfoList = new ArrayList<>(); List<ImageResult> images = new ArrayList<>(); List<ImageInfo> imageInfoList = new ArrayList<>(); List<ImageBean> images = new ArrayList<>(); int state; String issueReportId; @@ -75,8 +79,7 @@ // 添加间距装饰,确保图片有合适的间隔 mRecyclerView.addItemDecoration(new GridSpacingItemDecoration(4, DensityUtil.dip2px(this, 8), false)); mAdapter = new ImageAdapter(this, images, (v, position) -> { ImagePreview.getInstance().setContext(IssueDetailActivity.this).setImageList(imageInfoList).start(); ImagePreview.getInstance().with(IssueDetailActivity.this).setIndex(position).setMediaInfoList(imageInfoList).start(); }); mRecyclerView.setAdapter(mAdapter); } @@ -94,9 +97,31 @@ binding.setData(orderDetailResult); binding.setItemclidk(IssueDetailActivity.this); state = orderDetailResult.getStateId(); images.addAll(t.getContent().getImages()); for (ImageResult imageResult : images) { imageInfoList.add(imageResult.getWebPath()); if (!t.getContent().getImages().isEmpty()){ for (ImageResult imageResult:t.getContent().getImages()){ ImageBean imageBean=new ImageBean(); imageBean.setId(imageResult.getId()); imageBean.setWebPath(imageResult.getWebPath()); imageBean.setType(UplodFileState.IMG_TYPE); images.add(imageBean); ImageInfo info=new ImageInfo(); info.setOriginUrl(imageResult.getWebPath()); info.setType(Type.IMAGE); imageInfoList.add(info); } } if (!t.getContent().getVideos().isEmpty()){ for (ImageResult imageResult:t.getContent().getVideos()){ ImageBean imageBean=new ImageBean(); imageBean.setId(imageResult.getId()); imageBean.setWebPath(imageResult.getWebPath()); imageBean.setType(UplodFileState.VIDEO_TYPE); images.add(imageBean); ImageInfo info=new ImageInfo(); info.setOriginUrl(imageResult.getWebPath()); info.setType(Type.VIDEO); imageInfoList.add(info); } } mAdapter.notifyDataSetChanged(); switch (state) { app/src/main/java/com/dayu/pipirrapp/activity/OrderDetailActivity.java
@@ -19,9 +19,11 @@ import com.dayu.pipirrapp.MyApplication; import com.dayu.pipirrapp.R; import com.dayu.pipirrapp.adapter.ImageAdapter; import com.dayu.pipirrapp.bean.ImageBean; import com.dayu.pipirrapp.bean.net.DealDetailResult; import com.dayu.pipirrapp.bean.net.ImageResult; import com.dayu.pipirrapp.bean.net.OrderDetailResult; import com.dayu.pipirrapp.bean.net.UplodFileState; import com.dayu.pipirrapp.databinding.ActivityOrderDetailBinding; import com.dayu.pipirrapp.fragment.OrderFragment; import com.dayu.pipirrapp.net.ApiManager; @@ -43,6 +45,8 @@ import java.util.Map; import cc.shinichi.library.ImagePreview; import cc.shinichi.library.bean.ImageInfo; import cc.shinichi.library.bean.Type; /** * OrderDetailActivity - @@ -57,9 +61,9 @@ String workOrderId; String proResultId; ImageAdapter mAdapter; List<ImageResult> images = new ArrayList<>(); List<ImageBean> images = new ArrayList<>(); RecyclerView mRecyclerView; final List<String> imageInfoList = new ArrayList<>(); List<ImageInfo> imageInfoList = new ArrayList<>(); int ProResultStateId; private ActivityResultLauncher<Intent> activityResultLauncher = registerForActivityResult( @@ -120,7 +124,7 @@ // 添加间距装饰,确保图片有合适的间隔 mRecyclerView.addItemDecoration(new GridSpacingItemDecoration(4, DensityUtil.dip2px(this, 8), false)); mAdapter = new ImageAdapter(this, images, (v, position) -> { ImagePreview.getInstance().setContext(OrderDetailActivity.this).setImageList(imageInfoList).start(); ImagePreview.getInstance().with(OrderDetailActivity.this).setIndex(position).setMediaInfoList(imageInfoList).start(); }); mRecyclerView.setAdapter(mAdapter); @@ -218,9 +222,32 @@ if (t.getContent() != null) { binding.orderDealLL.setVisibility(View.VISIBLE); binding.setDealData(t.getContent()); images.addAll(t.getContent().getImages()); for (ImageResult imageResult : images) { imageInfoList.add(imageResult.getWebPath()); if (!t.getContent().getImages().isEmpty()){ for (ImageResult imageResult:t.getContent().getImages()){ ImageBean imageBean=new ImageBean(); imageBean.setId(imageResult.getId()); imageBean.setWebPath(imageResult.getWebPath()); imageBean.setType(UplodFileState.IMG_TYPE); images.add(imageBean); ImageInfo info=new ImageInfo(); info.setOriginUrl(imageResult.getWebPath()); info.setType(Type.IMAGE); imageInfoList.add(info); } } if (!t.getContent().getVideos().isEmpty()){ for (ImageResult imageResult:t.getContent().getVideos()){ ImageBean imageBean=new ImageBean(); imageBean.setId(imageResult.getId()); imageBean.setWebPath(imageResult.getWebPath()); imageBean.setType(UplodFileState.VIDEO_TYPE); images.add(imageBean); ImageInfo info=new ImageInfo(); info.setOriginUrl(imageResult.getWebPath()); info.setType(Type.VIDEO); imageInfoList.add(info); } } mAdapter.notifyDataSetChanged(); } else { app/src/main/java/com/dayu/pipirrapp/adapter/ImageAdapter.java
@@ -12,7 +12,9 @@ import com.bumptech.glide.load.resource.bitmap.CenterCrop; import com.bumptech.glide.load.resource.bitmap.RoundedCorners; import com.dayu.pipirrapp.R; import com.dayu.pipirrapp.bean.ImageBean; import com.dayu.pipirrapp.bean.net.ImageResult; import com.dayu.pipirrapp.bean.net.UplodFileState; import com.dayu.pipirrapp.tool.GlideEngine; import java.util.List; @@ -25,12 +27,12 @@ * @since 2024-11-27 */ public class ImageAdapter extends RecyclerView.Adapter<ImageAdapter.ImageViewHolder> { private List<ImageResult> imageUrls; // 图片的 URL 或本地路径 private List<ImageBean> imageUrls; // 图片的 URL 或本地路径 private Context mContext; private OnItemClickListener onItemClickListener; // 构造方法 public ImageAdapter(Context context, List<ImageResult> imageUrls, OnItemClickListener onItemClickListener) { public ImageAdapter(Context context, List<ImageBean> imageUrls, OnItemClickListener onItemClickListener) { this.imageUrls = imageUrls; this.mContext = context; this.onItemClickListener = onItemClickListener; @@ -46,9 +48,15 @@ @Override public void onBindViewHolder(ImageViewHolder holder, int position) { ImageBean imageBean=imageUrls.get(position); if (imageBean.getType()== UplodFileState.VIDEO_TYPE){ holder.play.setVisibility(View.VISIBLE); }else { holder.play.setVisibility(View.GONE); } // 使用 Glide 加载图片到 ImageView 中 Glide.with(holder.itemView.getContext()) .load(imageUrls.get(position).getWebPath()) // 加载图片的 URL 或路径 .load(imageBean.getWebPath()) // 加载图片的 URL 或路径 .thumbnail(0.1f) // 设置缩略图比例' .transform(new CenterCrop(), new RoundedCorners(8)) .placeholder(R.drawable.ps_image_placeholder) @@ -70,10 +78,12 @@ public static class ImageViewHolder extends RecyclerView.ViewHolder { ImageView imageView; ImageView play; public ImageViewHolder(View itemView) { super(itemView); imageView = itemView.findViewById(R.id.thumbnailImageView); play=itemView.findViewById(R.id.item_play); } } app/src/main/java/com/dayu/pipirrapp/bean/ImageBean.java
New file @@ -0,0 +1,38 @@ package com.dayu.pipirrapp.bean; /** * ImageBean -图片显示adapter * * @author zuoxiao * @version 1.0 * @since 2025-01-09 */ public class ImageBean { String id; String webPath; int type; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getWebPath() { return webPath; } public void setWebPath(String webPath) { this.webPath = webPath; } public int getType() { return type; } public void setType(int type) { this.type = type; } } app/src/main/java/com/dayu/pipirrapp/bean/net/AddIssueRequest.java
@@ -5,7 +5,7 @@ import java.util.Map; /** * AddIssueRequest - * AddIssueRequest - 添加问题上报 * * @author zuoxiao * @version 1.0 @@ -16,6 +16,7 @@ String inspectorId;//巡检员ID String content;//结果内容 List<ImageRequest> images = new ArrayList<>(); List<ImageRequest> videos = new ArrayList<>(); String completeTime;//任务完成时间 String lng; String lat; @@ -54,7 +55,12 @@ ImageRequest image = new ImageRequest(); image.setWebPath(data.getWebPath()); image.setId(data.getPostId()); images.add(image); if (data.getUploadType()==UplodFileState.IMG_TYPE){ images.add(image); }else { videos.add(image); } } } app/src/main/java/com/dayu/pipirrapp/bean/net/AddProcessingRequest.java
@@ -16,6 +16,7 @@ String inspectorId;//巡检员ID String content;//结果内容 List<ImageRequest> images = new ArrayList<>(); List<ImageRequest> videos = new ArrayList<>(); String completeTime;//任务完成时间 String lng; String lat; @@ -79,7 +80,12 @@ ImageRequest image = new ImageRequest(); image.setWebPath(data.getWebPath()); image.setId(data.getPostId()); images.add(image); if (data.getUploadType()==UplodFileState.IMG_TYPE){ images.add(image); }else { videos.add(image); } } } app/src/main/java/com/dayu/pipirrapp/bean/net/DealDetailResult.java
@@ -10,18 +10,37 @@ * @since 2024-12-06 */ public class DealDetailResult { String proResultId;//处理结果ID String workOrderId;// String inspector;// 巡检员 String content;//结果内容 double lng;// 经度 double lat;// 纬度 String completeTime;// 任务完成时间 精确到分 String reportTime;//上报时间 int state;//状态 1-已上报,2-已通过,3-已驳回 String stateName;// 状态名称 //处理结果ID String proResultId; String workOrderId; // 巡检员 String inspector; //结果内容 String content; // 经度 double lng; // 纬度 double lat; // 任务完成时间 精确到分 String completeTime; //上报时间 String reportTime; //状态 1-已上报,2-已通过,3-已驳回 int state; // 状态名称 String stateName; List<ImageResult> images; List<ImageResult> videos; public List<ImageResult> getVideos() { return videos; } public void setVideos(List<ImageResult> videos) { this.videos = videos; } public List<ImageResult> getImages() { return images; app/src/main/java/com/dayu/pipirrapp/bean/net/IssueResult.java
@@ -20,11 +20,21 @@ //String audios: [], //String videos: [], public List<ImageResult> images; public List<ImageResult> videos; public String replyTime;//上报回复时间 null, public String replyContent;//回复内容 public int stateId;// public String state;//未受理 public List<ImageResult> getVideos() { return videos; } public void setVideos(List<ImageResult> videos) { this.videos = videos; } public String getIssueReportId() { return issueReportId; } app/src/main/java/com/dayu/pipirrapp/net/ApiManager.java
@@ -313,13 +313,18 @@ int progress = (int) (100 * bytesWritten / contentLength); // 例如:更新 ProgressBar 或显示进度 runOnUiThread(() -> { if (progress <5) { uplodData.setProgress(0); } // 进度条更新代码 if (adapter != null && uplodData.getAdapterPosition() != -1) { //优化不频繁更新进度 if (progress - uplodData.getProgress() > 5 || progress == 100){ if (progress - uplodData.getProgress() > 5 || progress == 100) { uplodData.setProgress(progress); adapter.updateProgress(uplodData); } } MyLog.d("progressRequestBodyHolder>>>path" + "adapterPosition:" + uplodData.getAdapterPosition() + ">>>上传进度: " + progress + "%"); }); app/src/main/java/com/dayu/pipirrapp/net/RetrofitClient.java
@@ -36,7 +36,7 @@ //添加日志拦截器 //添加数据请求统一处理拦截器 // if (BuildConfig.DEBUG) { // builder.addInterceptor(loggingInterceptor); builder.addInterceptor(loggingInterceptor); // } OkHttpClient client = builder.build(); app/src/main/res/drawable/play.xml
New file @@ -0,0 +1,18 @@ <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="48" android:viewportHeight="48"> <path android:pathData="M24,44C35.046,44 44,35.046 44,24C44,12.954 35.046,4 24,4C12.954,4 4,12.954 4,24C4,35.046 12.954,44 24,44Z" android:strokeLineJoin="round" android:strokeWidth="4" android:fillColor="#00000000" android:strokeColor="#FFFFFF"/> <path android:pathData="M20,24V17.072L26,20.536L32,24L26,27.464L20,30.928V24Z" android:strokeLineJoin="round" android:strokeWidth="4" android:fillColor="#00000000" android:strokeColor="#FFFFFF"/> </vector> app/src/main/res/layout/item_image.xml
@@ -3,6 +3,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="8dp" android:layout_gravity="center" android:elevation="4dp"> <ImageView @@ -11,4 +12,13 @@ android:layout_height="match_parent" android:scaleType="centerCrop" /> <ImageView android:id="@+id/item_play" android:layout_width="30dp" android:layout_height="30dp" android:layout_gravity="center" android:src="@drawable/play"/> </androidx.cardview.widget.CardView>