From 609961d911cd56a598105826393cff734ac02dc2 Mon Sep 17 00:00:00 2001 From: lihongwei Date: Wed, 4 Sep 2024 15:22:33 +0800 Subject: [PATCH] =?UTF-8?q?=20V1.0.1=EF=BC=882=EF=BC=89=EF=BC=8C=E9=99=90?= =?UTF-8?q?=E5=88=B6=E5=AF=BC=E5=85=A5=E5=9B=BE=E7=89=87=E5=A4=A7=E5=B0=8F?= =?UTF-8?q?=EF=BC=8C=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 4 +- .../Category/ImageFragment.java | 14 +- .../Category/ImageRecyclerViewAdapter.java | 174 +++--- .../Favorite/FavoriteAdapter.java | 10 +- .../Import/ImportListAdapter.java | 514 +++++++++--------- .../Import/ImportListFragment.java | 62 ++- .../papertracingart/Utils/DiffUtilUtils.java | 53 +- .../main/res/drawable/selector_favorite.xml | 2 + app/src/main/res/drawable/unfavorite.xml | 2 +- app/src/main/res/layout/item_image.xml | 26 +- 10 files changed, 427 insertions(+), 434 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index e0ec4b5..7fd8cf4 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -13,8 +13,8 @@ android { applicationId = "com.sketch.papertracingart" minSdk = 23 targetSdk = 34 - versionCode = 1 - versionName = "1.0.0" + versionCode = 2 + versionName = "1.0.1" setProperty("archivesBaseName", "AR Draw Sketch_V" + versionName + "(${versionCode})_$timestamp") testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/app/src/main/java/com/sketch/papertracingart/Category/ImageFragment.java b/app/src/main/java/com/sketch/papertracingart/Category/ImageFragment.java index 3c57f9c..83c9f0a 100644 --- a/app/src/main/java/com/sketch/papertracingart/Category/ImageFragment.java +++ b/app/src/main/java/com/sketch/papertracingart/Category/ImageFragment.java @@ -13,6 +13,8 @@ import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.sketch.papertracingart.R; +import com.sketch.papertracingart.Room.AppDatabase; +import com.sketch.papertracingart.Room.FavoriteImage; import com.sketch.papertracingart.Utils.ItemDecoration; import java.io.IOException; @@ -26,6 +28,8 @@ public class ImageFragment extends Fragment { private RecyclerView recyclerView; private ImageRecyclerViewAdapter adapter; + private List imageFavorite = new ArrayList<>(); + public ImageFragment() { // 必须有一个空的构造函数 } @@ -54,6 +58,8 @@ public class ImageFragment extends Fragment { recyclerView.setLayoutManager(new GridLayoutManager(getContext(), 2)); List imagePaths = getImagePaths(category); + + adapter = new ImageRecyclerViewAdapter(imagePaths,requireActivity()); recyclerView.setAdapter(adapter); ItemDecoration itemDecoration = new ItemDecoration(12, 10, 9); @@ -63,12 +69,12 @@ public class ImageFragment extends Fragment { } - @Override - public void onPause() { - super.onPause(); + public void onResume() { + super.onResume(); - Log.d("-----------","-------------onPause------"); + adapter.notifyDataSetChanged(); + Log.d("-----------", "-------------onPause------"); } private List getImagePaths(String category) { diff --git a/app/src/main/java/com/sketch/papertracingart/Category/ImageRecyclerViewAdapter.java b/app/src/main/java/com/sketch/papertracingart/Category/ImageRecyclerViewAdapter.java index afc89c0..6a8ce16 100644 --- a/app/src/main/java/com/sketch/papertracingart/Category/ImageRecyclerViewAdapter.java +++ b/app/src/main/java/com/sketch/papertracingart/Category/ImageRecyclerViewAdapter.java @@ -2,35 +2,31 @@ package com.sketch.papertracingart.Category; import android.app.Activity; import android.content.Intent; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import androidx.annotation.NonNull; -import androidx.lifecycle.LifecycleOwner; -import androidx.lifecycle.LiveData; -import androidx.lifecycle.Observer; -import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.RecyclerView; +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.load.resource.bitmap.CenterCrop; +import com.bumptech.glide.load.resource.bitmap.RoundedCorners; +import com.bumptech.glide.request.RequestOptions; import com.sketch.papertracingart.Camera.CameraActivity; import com.sketch.papertracingart.R; import com.sketch.papertracingart.Room.AppDatabase; import com.sketch.papertracingart.Room.FavoriteImage; import com.sketch.papertracingart.Room.FavoriteImageDao; -import com.sketch.papertracingart.Utils.DiffUtilUtils; -import com.bumptech.glide.Glide; -import com.bumptech.glide.load.engine.DiskCacheStrategy; import java.util.List; -import java.util.Objects; +import java.util.concurrent.Executors; public class ImageRecyclerViewAdapter extends RecyclerView.Adapter { private List imagePaths; - private List imagePathsOld; private final FavoriteImageDao favoriteImageDao; private final Activity context; @@ -41,16 +37,6 @@ public class ImageRecyclerViewAdapter extends RecyclerView.Adapter newImagePaths) { - - imagePathsOld = imagePaths; - imagePaths = newImagePaths; - DiffUtil.Callback diffCallback = DiffUtilUtils.createImageDiffCallback(imagePathsOld, imagePaths); - DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallback); - diffResult.dispatchUpdatesTo(this); - } - @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { @@ -63,22 +49,40 @@ public class ImageRecyclerViewAdapter extends RecyclerView.Adapter { + final boolean[] isFavorite = {checkFavoriteStatus(imagePath)}; + // 更新 UI 需要在主线程中执行 + context.runOnUiThread(() -> { + updateFavoriteIcon(holder, isFavorite[0]); + holder.favoriteButton.setOnClickListener(v -> { + isFavorite[0] = !isFavorite[0]; + updateFavoriteIcon(holder, isFavorite[0]); + updateDatabase(imagePath, isFavorite[0]); + }); + }); + }); holder.imageView.setOnClickListener(v -> { Intent intent = new Intent(context, CameraActivity.class); intent.putExtra("imagePath", imagePath); context.startActivity(intent); }); - - updateFavoriteButton(holder, imagePath); - - holder.favoriteButton.setOnClickListener(v -> { - toggleFavorite(holder, imagePath); - }); } @Override @@ -86,6 +90,34 @@ public class ImageRecyclerViewAdapter extends RecyclerView.Adapter { + FavoriteImage favoriteImage = new FavoriteImage(true, imagePath); + if (isFavorite) { + favoriteImageDao.insert(favoriteImage); + } else { + favoriteImageDao.deleteByImagePath(imagePath); + } + }); + } + + private void updateFavoriteIcon(ViewHolder holder, boolean isFavorite) { + holder.favoriteButton.setImageResource(isFavorite ? R.drawable.favorite : R.drawable.unfavorite); + } + + // 更新数据并使用 DiffUtil + public void updateImagePaths(List newImagePaths) { + + imagePaths = newImagePaths; + + notifyDataSetChanged(); + } + static class ViewHolder extends RecyclerView.ViewHolder { ImageView imageView; ImageView favoriteButton; @@ -97,86 +129,4 @@ public class ImageRecyclerViewAdapter extends RecyclerView.Adapter oldItems; - private List newItems; - - MyDiffCallback(List oldItems, List newItems) { - this.oldItems = oldItems; - this.newItems = newItems; - } - - @Override - public int getOldListSize() { - return oldItems.size(); - } - - @Override - public int getNewListSize() { - return newItems.size(); - } - - @Override - public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { - return Objects.equals(oldItems.get(oldItemPosition), newItems.get(newItemPosition)); - } - - @Override - public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { - String newItem = newItems.get(newItemPosition); - String oldItem = oldItems.get(oldItemPosition); - return Objects.equals(oldItem, newItem); - } - } - - private void updateFavoriteButton(ViewHolder holder, String imagePath) { - LiveData favoriteImageLiveData = favoriteImageDao.getFavoriteImageByPath(imagePath); - favoriteImageLiveData.observe((LifecycleOwner) context, new Observer() { - @Override - public void onChanged(FavoriteImage favoriteImage) { - boolean isFavorite = favoriteImage != null && favoriteImage.isFavorite(); - int iconResId = isFavorite ? R.drawable.favorite : R.drawable.unfavorite; - holder.favoriteButton.setImageResource(iconResId); - } - }); - } - - private void toggleFavorite(ViewHolder holder, String imagePath) { - - AppDatabase.getDatabaseWriteExecutor().execute(() -> { - - FavoriteImage favoriteImage = favoriteImageDao.getByImagePath(imagePath); - context.runOnUiThread(new Runnable() { - @Override - public void run() { - Log.d("-----------", "onChanged favoriteImage=" + favoriteImage); - if (favoriteImage != null) { - removeImageFromFavorites(imagePath); - holder.favoriteButton.setImageResource(R.drawable.unfavorite); - } else { - addImageToFavorites(imagePath); - holder.favoriteButton.setImageResource(R.drawable.favorite); - } - } - }); - - }); - - - - } - - private void addImageToFavorites(String imagePath) { - AppDatabase.getDatabaseWriteExecutor().execute(() -> { - FavoriteImage favoriteImage = new FavoriteImage(true, imagePath); - favoriteImageDao.insert(favoriteImage); - }); - } - - private void removeImageFromFavorites(String imagePath) { - AppDatabase.getDatabaseWriteExecutor().execute(() -> { - favoriteImageDao.deleteByImagePath(imagePath); - }); - } } - diff --git a/app/src/main/java/com/sketch/papertracingart/Favorite/FavoriteAdapter.java b/app/src/main/java/com/sketch/papertracingart/Favorite/FavoriteAdapter.java index a12dc55..6e52776 100644 --- a/app/src/main/java/com/sketch/papertracingart/Favorite/FavoriteAdapter.java +++ b/app/src/main/java/com/sketch/papertracingart/Favorite/FavoriteAdapter.java @@ -12,6 +12,9 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; +import com.bumptech.glide.load.resource.bitmap.CenterCrop; +import com.bumptech.glide.load.resource.bitmap.RoundedCorners; +import com.bumptech.glide.request.RequestOptions; import com.sketch.papertracingart.Camera.CameraActivity; import com.sketch.papertracingart.R; import com.sketch.papertracingart.Room.AppDatabase; @@ -50,9 +53,13 @@ public class FavoriteAdapter extends RecyclerView.Adapter { - - private List imagePaths; - - private List imagePathsOld; - private final FavoriteImageDao favoriteImageDao; - private final Activity context;// 图片路径列表 - - public ImportListAdapter(List imagePaths, Activity context) { - this.imagePaths = imagePaths; - this.context = context; - AppDatabase db = AppDatabase.getInstance(context); - this.favoriteImageDao = db.favoriteImageDao(); // 初始化 DAO - } - - // 更新数据并使用 DiffUtil - public void updateImagePaths(List newImagePaths) { - -// imagePathsOld = imagePaths; - imagePaths = newImagePaths; -// DiffUtil.Callback diffCallback = DiffUtilUtils.createImageDiffCallback(imagePathsOld, imagePaths); -// DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallback); -// diffResult.dispatchUpdatesTo(this); - - notifyDataSetChanged(); - } - - @NonNull - @Override - public ImageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - // 创建并返回 ImageViewHolder - View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_image, parent, false); - return new ImageViewHolder(view); - } - - @Override - public void onBindViewHolder(@NonNull ImageViewHolder holder, int position) { - String imagePath = imagePaths.get(position); // 获取当前图片的路径 - Log.d("imagepTh","imagePath"+imagePath); - Log.d("imagepTh","imagePaths"+imagePath); - Context context = holder.imageView.getContext(); - - if (imagePath.startsWith("/data/user/")) { - Glide.with(context) - .load(imagePath) - .diskCacheStrategy(DiskCacheStrategy.ALL) - .into(holder.imageView); - } else { - Glide.with(context) - .load("file:///android_asset/" + imagePath) - .diskCacheStrategy(DiskCacheStrategy.ALL) - .into(holder.imageView); - } - - holder.imageView.setOnClickListener(v -> { - Intent intent = new Intent(context, CameraActivity.class); - intent.putExtra("imagePath", imagePath); - context.startActivity(intent); - }); - - // 更新收藏按钮状态 - updateFavoriteButton(holder, imagePath); - - // 设置收藏按钮点击事件 - holder.favoriteButton.setOnClickListener(v -> { - // 检查当前图片是否被收藏 - new CheckFavoriteTask(holder, imagePath).execute(); - }); - - } - - @Override - public int getItemCount() { - return imagePaths.size(); // 返回图片的数量 - } - - - private static class MyDiffCallback extends DiffUtil.Callback { - private List oldItems; - private List newItems; - - MyDiffCallback(List oldItems, List newItems) { - this.oldItems = oldItems; - this.newItems = newItems; - } - - @Override - public int getOldListSize() { - return oldItems.size(); - } - - @Override - public int getNewListSize() { - return newItems.size(); - } - - @Override - public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { - return Objects.equals(oldItems.get(oldItemPosition), newItems.get(newItemPosition)); - } - - @Override - public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { - String newItem = newItems.get(newItemPosition); - String oldItem = oldItems.get(oldItemPosition); - return Objects.equals(oldItem, newItem); - } - } - - - - /** - * ViewHolder 类,用于缓存视图 - */ - static class ImageViewHolder extends RecyclerView.ViewHolder { - ImageView imageView; - ImageView favoriteButton; - - ImageViewHolder(View view) { - super(view); - imageView = view.findViewById(R.id.image_view); - favoriteButton = view.findViewById(R.id.btn_favorite); - } - } - - // 更新收藏按钮状态(通过异步任务) - private void updateFavoriteButton(ImportListAdapter.ImageViewHolder holder, String imagePath) { - LiveData favoriteImageLiveData = favoriteImageDao.getFavoriteImageByPath(imagePath); - favoriteImageLiveData.observe((LifecycleOwner) context, new Observer() { - @Override - public void onChanged(FavoriteImage favoriteImage) { - boolean isFavorite = favoriteImage != null && favoriteImage.isFavorite(); - int iconResId = isFavorite ? R.drawable.favorite : R.drawable.unfavorite; - holder.favoriteButton.setImageResource(iconResId); - } - }); - } - - private void toggleFavorite(ImportListAdapter.ImageViewHolder holder, String imagePath) { - - AppDatabase.getDatabaseWriteExecutor().execute(() -> { - - FavoriteImage favoriteImage = favoriteImageDao.getByImagePath(imagePath); - context.runOnUiThread(new Runnable() { - @Override - public void run() { - - Log.d("-----------", "onChanged favoriteImage=" + favoriteImage); - if (favoriteImage != null) { - removeImageFromFavorites(imagePath); - holder.favoriteButton.setImageResource(R.drawable.unfavorite); - } else { - addImageToFavorites(imagePath); - holder.favoriteButton.setImageResource(R.drawable.favorite); - } - } - }); - - }); - - - - } - - // 刷新所有图片的收藏状态 - public void refreshFavoriteStatusImport() { - for (int i = 0; i < imagePaths.size(); i++) { - notifyItemChanged(i); - } - } - - // 添加图片到收藏数据库 - private void addImageToFavorites(String imagePath) { - AsyncTask.execute(() -> { - FavoriteImage favoriteImage = favoriteImageDao.getByImagePath(imagePath); - if (favoriteImage == null) { - favoriteImage = new FavoriteImage(true, imagePath); - favoriteImageDao.insert(favoriteImage); // 插入新的收藏记录 - } else { - favoriteImage.setFavorite(true); - favoriteImageDao.update(favoriteImage); // 更新收藏状态 - } - }); - } - - // 从收藏数据库中移除图片 - private void removeImageFromFavorites(String imagePath) { - AppDatabase.getDatabaseWriteExecutor().execute(() -> { - favoriteImageDao.deleteByImagePath(imagePath); - }); - } - - // 异步任务:检查图片是否收藏 - private class CheckFavoriteTask extends AsyncTask { - private final ImportListAdapter.ImageViewHolder holder; - private final String imagePath; - - CheckFavoriteTask(ImportListAdapter.ImageViewHolder holder, String imagePath) { - this.holder = holder; - this.imagePath = imagePath; - } - - @Override - protected Boolean doInBackground(Void... voids) { - FavoriteImage favoriteImage = favoriteImageDao.getByImagePath(imagePath); - return favoriteImage != null && favoriteImage.isFavorite(); - } - - @Override - protected void onPostExecute(Boolean isFavorite) { - if (isFavorite) { - // 如果已经收藏,则移除收藏 - removeImageFromFavorites(imagePath); - holder.favoriteButton.setImageResource(R.drawable.unfavorite); // 更新按钮图标为未收藏状态 - } else { - // 如果未收藏,则添加到收藏 - addImageToFavorites(imagePath); - holder.favoriteButton.setImageResource(R.drawable.favorite); // 更新按钮图标为收藏状态 - } - } - } - -} +//package com.sketch.papertracingart.Import; +// +//import android.app.Activity; +//import android.content.Context; +//import android.content.Intent; +//import android.os.AsyncTask; +//import android.util.Log; +//import android.view.LayoutInflater; +//import android.view.View; +//import android.view.ViewGroup; +//import android.widget.ImageView; +// +//import androidx.annotation.NonNull; +//import androidx.lifecycle.LifecycleOwner; +//import androidx.lifecycle.LiveData; +//import androidx.lifecycle.Observer; +//import androidx.recyclerview.widget.DiffUtil; +//import androidx.recyclerview.widget.RecyclerView; +// +//import com.sketch.papertracingart.Camera.CameraActivity; +//import com.sketch.papertracingart.R; +//import com.sketch.papertracingart.Room.AppDatabase; +//import com.sketch.papertracingart.Room.FavoriteImage; +//import com.sketch.papertracingart.Room.FavoriteImageDao; +//import com.sketch.papertracingart.Utils.DiffUtilUtils; +//import com.bumptech.glide.Glide; +//import com.bumptech.glide.load.engine.DiskCacheStrategy; +// +//import java.util.List; +//import java.util.Objects; +// +///** +// * RecyclerView 的适配器,用于显示图片。 +// */ +//public class ImportListAdapter extends RecyclerView.Adapter { +// +// private List imagePaths; +// +// private List imagePathsOld; +// private final FavoriteImageDao favoriteImageDao; +// private final Activity context;// 图片路径列表 +// +// public ImportListAdapter(List imagePaths, Activity context) { +// this.imagePaths = imagePaths; +// this.context = context; +// AppDatabase db = AppDatabase.getInstance(context); +// this.favoriteImageDao = db.favoriteImageDao(); // 初始化 DAO +// } +// +// // 更新数据并使用 DiffUtil +// public void updateImagePaths(List newImagePaths) { +// +//// imagePathsOld = imagePaths; +// imagePaths = newImagePaths; +//// DiffUtil.Callback diffCallback = DiffUtilUtils.createImageDiffCallback(imagePathsOld, imagePaths); +//// DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(diffCallback); +//// diffResult.dispatchUpdatesTo(this); +// +// notifyDataSetChanged(); +// } +// +// @NonNull +// @Override +// public ImageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { +// // 创建并返回 ImageViewHolder +// View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_image, parent, false); +// return new ImageViewHolder(view); +// } +// +// @Override +// public void onBindViewHolder(@NonNull ImageViewHolder holder, int position) { +// String imagePath = imagePaths.get(position); // 获取当前图片的路径 +// Log.d("imagepTh","imagePath"+imagePath); +// Log.d("imagepTh","imagePaths"+imagePath); +// Context context = holder.imageView.getContext(); +// +// if (imagePath.startsWith("/data/user/")) { +// Glide.with(context) +// .load(imagePath) +// .diskCacheStrategy(DiskCacheStrategy.ALL) +// .into(holder.imageView); +// } else { +// Glide.with(context) +// .load("file:///android_asset/" + imagePath) +// .diskCacheStrategy(DiskCacheStrategy.ALL) +// .into(holder.imageView); +// } +// +// holder.imageView.setOnClickListener(v -> { +// Intent intent = new Intent(context, CameraActivity.class); +// intent.putExtra("imagePath", imagePath); +// context.startActivity(intent); +// }); +// +// // 更新收藏按钮状态 +// updateFavoriteButton(holder, imagePath); +// +// // 设置收藏按钮点击事件 +// holder.favoriteButton.setOnClickListener(v -> { +// // 检查当前图片是否被收藏 +// new CheckFavoriteTask(holder, imagePath).execute(); +// }); +// +// } +// +// @Override +// public int getItemCount() { +// return imagePaths.size(); // 返回图片的数量 +// } +// +// +// private static class MyDiffCallback extends DiffUtil.Callback { +// private List oldItems; +// private List newItems; +// +// MyDiffCallback(List oldItems, List newItems) { +// this.oldItems = oldItems; +// this.newItems = newItems; +// } +// +// @Override +// public int getOldListSize() { +// return oldItems.size(); +// } +// +// @Override +// public int getNewListSize() { +// return newItems.size(); +// } +// +// @Override +// public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { +// return Objects.equals(oldItems.get(oldItemPosition), newItems.get(newItemPosition)); +// } +// +// @Override +// public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { +// String newItem = newItems.get(newItemPosition); +// String oldItem = oldItems.get(oldItemPosition); +// return Objects.equals(oldItem, newItem); +// } +// } +// +// +// +// /** +// * ViewHolder 类,用于缓存视图 +// */ +// static class ImageViewHolder extends RecyclerView.ViewHolder { +// ImageView imageView; +// ImageView favoriteButton; +// +// ImageViewHolder(View view) { +// super(view); +// imageView = view.findViewById(R.id.image_view); +// favoriteButton = view.findViewById(R.id.btn_favorite); +// } +// } +// +// // 更新收藏按钮状态(通过异步任务) +// private void updateFavoriteButton(ImportListAdapter.ImageViewHolder holder, String imagePath) { +// LiveData favoriteImageLiveData = favoriteImageDao.getFavoriteImageByPath(imagePath); +// favoriteImageLiveData.observe((LifecycleOwner) context, new Observer() { +// @Override +// public void onChanged(FavoriteImage favoriteImage) { +// boolean isFavorite = favoriteImage != null && favoriteImage.isFavorite(); +// int iconResId = isFavorite ? R.drawable.favorite : R.drawable.unfavorite; +// holder.favoriteButton.setImageResource(iconResId); +// } +// }); +// } +// +// private void toggleFavorite(ImportListAdapter.ImageViewHolder holder, String imagePath) { +// +// AppDatabase.getDatabaseWriteExecutor().execute(() -> { +// +// FavoriteImage favoriteImage = favoriteImageDao.getByImagePath(imagePath); +// context.runOnUiThread(new Runnable() { +// @Override +// public void run() { +// +// Log.d("-----------", "onChanged favoriteImage=" + favoriteImage); +// if (favoriteImage != null) { +// removeImageFromFavorites(imagePath); +// holder.favoriteButton.setImageResource(R.drawable.unfavorite); +// } else { +// addImageToFavorites(imagePath); +// holder.favoriteButton.setImageResource(R.drawable.favorite); +// } +// } +// }); +// +// }); +// +// +// +// } +// +// // 刷新所有图片的收藏状态 +// public void refreshFavoriteStatusImport() { +// for (int i = 0; i < imagePaths.size(); i++) { +// notifyItemChanged(i); +// } +// } +// +// // 添加图片到收藏数据库 +// private void addImageToFavorites(String imagePath) { +// AsyncTask.execute(() -> { +// FavoriteImage favoriteImage = favoriteImageDao.getByImagePath(imagePath); +// if (favoriteImage == null) { +// favoriteImage = new FavoriteImage(true, imagePath); +// favoriteImageDao.insert(favoriteImage); // 插入新的收藏记录 +// } else { +// favoriteImage.setFavorite(true); +// favoriteImageDao.update(favoriteImage); // 更新收藏状态 +// } +// }); +// } +// +// // 从收藏数据库中移除图片 +// private void removeImageFromFavorites(String imagePath) { +// AppDatabase.getDatabaseWriteExecutor().execute(() -> { +// favoriteImageDao.deleteByImagePath(imagePath); +// }); +// } +// +// // 异步任务:检查图片是否收藏 +// private class CheckFavoriteTask extends AsyncTask { +// private final ImportListAdapter.ImageViewHolder holder; +// private final String imagePath; +// +// CheckFavoriteTask(ImportListAdapter.ImageViewHolder holder, String imagePath) { +// this.holder = holder; +// this.imagePath = imagePath; +// } +// +// @Override +// protected Boolean doInBackground(Void... voids) { +// FavoriteImage favoriteImage = favoriteImageDao.getByImagePath(imagePath); +// return favoriteImage != null && favoriteImage.isFavorite(); +// } +// +// @Override +// protected void onPostExecute(Boolean isFavorite) { +// if (isFavorite) { +// // 如果已经收藏,则移除收藏 +// removeImageFromFavorites(imagePath); +// holder.favoriteButton.setImageResource(R.drawable.unfavorite); // 更新按钮图标为未收藏状态 +// } else { +// // 如果未收藏,则添加到收藏 +// addImageToFavorites(imagePath); +// holder.favoriteButton.setImageResource(R.drawable.favorite); // 更新按钮图标为收藏状态 +// } +// } +// } +// +//} diff --git a/app/src/main/java/com/sketch/papertracingart/Import/ImportListFragment.java b/app/src/main/java/com/sketch/papertracingart/Import/ImportListFragment.java index 3f13fb4..869f1b4 100644 --- a/app/src/main/java/com/sketch/papertracingart/Import/ImportListFragment.java +++ b/app/src/main/java/com/sketch/papertracingart/Import/ImportListFragment.java @@ -17,6 +17,7 @@ import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import com.sketch.papertracingart.Category.ImageRecyclerViewAdapter; import com.sketch.papertracingart.R; import com.sketch.papertracingart.Room.AppDatabase; import com.sketch.papertracingart.Room.ImageEntry; @@ -30,16 +31,13 @@ import java.io.InputStream; import java.util.ArrayList; import java.util.List; -/** - * 显示图片列表的 Fragment。 - */ public class ImportListFragment extends Fragment { private static final int PICK_IMAGE_REQUEST_CODE = 202; // 请求码,用于标识图片选择 private ImageView btnSelectImage; // 选择图片按钮 private RecyclerView recyclerView; // 显示图片的 RecyclerView - private ImportListAdapter importListAdapter; // 图片适配器 + private ImageRecyclerViewAdapter adapter; // 图片适配器 private List imagePaths = new ArrayList<>(); // 图片路径列表 private AppDatabase appDatabase; // 数据库实例 private ImageEntryDao imageEntryDao; // 图片条目 DAO @@ -62,8 +60,8 @@ public class ImportListFragment extends Fragment { recyclerView.setLayoutManager(new GridLayoutManager(getContext(), 2)); // 网格布局,每行显示两个图片\ ItemDecoration itemDecoration = new ItemDecoration(12, 10, 9); recyclerView.addItemDecoration(itemDecoration); - importListAdapter = new ImportListAdapter(imagePaths, requireActivity()); // 初始化适配器 - recyclerView.setAdapter(importListAdapter); // 设置适配器 + adapter = new ImageRecyclerViewAdapter(imagePaths,requireActivity()); // 初始化适配器 + recyclerView.setAdapter(adapter); // 设置适配器 // 设置选择图片按钮的点击事件 btnSelectImage.setOnClickListener(new View.OnClickListener() { @@ -84,6 +82,14 @@ public class ImportListFragment extends Fragment { return view; } + @Override + public void onResume() { + super.onResume(); + + adapter.notifyDataSetChanged(); + + } + /** * 打开图片选择器。 */ @@ -99,11 +105,43 @@ public class ImportListFragment extends Fragment { if (requestCode == PICK_IMAGE_REQUEST_CODE && resultCode == getActivity().RESULT_OK && data != null) { Uri selectedImageUri = data.getData(); // 获取选中的图片 URI if (selectedImageUri != null) { - saveImageToInternalStorage(selectedImageUri); // 保存图片到内部存储 + try { + if (isImageSizeAcceptable(selectedImageUri)) { + saveImageToInternalStorage(selectedImageUri); // 保存图片到内部存储 + } else { + Toast.makeText(getContext(), "图片大小超过限制", Toast.LENGTH_SHORT).show(); + } + } catch (IOException e) { + e.printStackTrace(); + Toast.makeText(getContext(), "无法获取图片大小: " + e.getMessage(), Toast.LENGTH_SHORT).show(); + } } } } + /** + * 检查图片大小是否在允许范围内。 + * + * @param uri 选中的图片 URI + * @return 图片大小是否符合要求 + * @throws IOException 读取图片时可能抛出的异常 + */ + private boolean isImageSizeAcceptable(Uri uri) throws IOException { + InputStream inputStream = requireContext().getContentResolver().openInputStream(uri); + if (inputStream == null) { + return false; + } + + // 获取图片大小(字节) + long fileSize = inputStream.available(); + inputStream.close(); + + // 设置图片大小限制,单位为字节(例如,2MB = 2 * 1024 * 1024 字节) + long maxFileSize = 10 * 1024 * 1024; + + return fileSize <= maxFileSize; + } + /** * 将选中的图片保存到内部存储。 * @@ -142,7 +180,7 @@ public class ImportListFragment extends Fragment { requireActivity().runOnUiThread(new Runnable() { @Override public void run() { - importListAdapter.updateImagePaths(imagePaths); + adapter.updateImagePaths(imagePaths); Log.d("--------1111111---", "imagePaths= +" + imagePaths.size()); setView(!imagePaths.isEmpty()); @@ -214,7 +252,7 @@ public class ImportListFragment extends Fragment { imagePaths.add(imageEntry.getImagePath()); // 添加路径到列表 } requireActivity().runOnUiThread(() -> { - importListAdapter.updateImagePaths(imagePaths); + adapter.updateImagePaths(imagePaths); Log.d("--------22222222---", "imagePaths= +" + imagePaths.size()); @@ -223,12 +261,6 @@ public class ImportListFragment extends Fragment { }); // 更新 RecyclerView }).start(); } - - - - - - private void setView(Boolean hasData) { if (hasData) { recyclerView.setVisibility(View.VISIBLE); diff --git a/app/src/main/java/com/sketch/papertracingart/Utils/DiffUtilUtils.java b/app/src/main/java/com/sketch/papertracingart/Utils/DiffUtilUtils.java index 1fe159a..aa1e0b4 100644 --- a/app/src/main/java/com/sketch/papertracingart/Utils/DiffUtilUtils.java +++ b/app/src/main/java/com/sketch/papertracingart/Utils/DiffUtilUtils.java @@ -4,36 +4,35 @@ import androidx.recyclerview.widget.DiffUtil; import java.util.List; -public class DiffUtilUtils { +public class DiffUtilUtils extends DiffUtil.Callback { - /** - * 创建一个 DiffUtil.Callback 实例 - * - * @param oldList 旧数据列表 - * @param newList 新数据列表 - * @return DiffUtil.Callback 实例 - */ - public static DiffUtil.Callback createImageDiffCallback(List oldList, List newList) { - return new DiffUtil.Callback() { - @Override - public int getOldListSize() { - return oldList.size(); - } + private final List oldList; + private final List newList; - @Override - public int getNewListSize() { - return newList.size(); - } + public DiffUtilUtils(List oldList, List newList) { + this.oldList = oldList; + this.newList = newList; + } - @Override - public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { - return oldList.get(oldItemPosition).equals(newList.get(newItemPosition)); - } + @Override + public int getOldListSize() { + return oldList.size(); + } - @Override - public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { - return oldList.get(oldItemPosition).equals(newList.get(newItemPosition)); - } - }; + @Override + public int getNewListSize() { + return newList.size(); + } + + @Override + public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { + // 比较项目是否相同(例如通过唯一的ID或路径) + return oldList.get(oldItemPosition).equals(newList.get(newItemPosition)); + } + + @Override + public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { + // 比较内容是否相同 + return oldList.get(oldItemPosition).equals(newList.get(newItemPosition)); } } diff --git a/app/src/main/res/drawable/selector_favorite.xml b/app/src/main/res/drawable/selector_favorite.xml index a8b409b..d3f606f 100644 --- a/app/src/main/res/drawable/selector_favorite.xml +++ b/app/src/main/res/drawable/selector_favorite.xml @@ -1,4 +1,6 @@ + + \ No newline at end of file diff --git a/app/src/main/res/drawable/unfavorite.xml b/app/src/main/res/drawable/unfavorite.xml index 43f12c9..82c3c74 100644 --- a/app/src/main/res/drawable/unfavorite.xml +++ b/app/src/main/res/drawable/unfavorite.xml @@ -5,5 +5,5 @@ android:viewportHeight="20"> + android:fillColor="#ACB3C1"/> diff --git a/app/src/main/res/layout/item_image.xml b/app/src/main/res/layout/item_image.xml index 275587b..f2b79ce 100644 --- a/app/src/main/res/layout/item_image.xml +++ b/app/src/main/res/layout/item_image.xml @@ -7,34 +7,34 @@ + + android:layout_width="match_parent" + android:layout_height="match_parent"> + android:layout_marginTop="6dp" + android:layout_marginEnd="6dp" + android:src="@drawable/selector_favorite" /> - -