V1.0.1(2),限制导入图片大小,优化

This commit is contained in:
lihongwei 2024-09-04 15:22:33 +08:00
parent 8d47a00c2d
commit 609961d911
10 changed files with 427 additions and 434 deletions

View File

@ -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"
}

View File

@ -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<Boolean> imageFavorite = new ArrayList<>();
public ImageFragment() {
// 必须有一个空的构造函数
}
@ -54,6 +58,8 @@ public class ImageFragment extends Fragment {
recyclerView.setLayoutManager(new GridLayoutManager(getContext(), 2));
List<String> 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<String> getImagePaths(String category) {

View File

@ -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<ImageRecyclerViewAdapter.ViewHolder> {
private List<String> imagePaths;
private List<String> imagePathsOld;
private final FavoriteImageDao favoriteImageDao;
private final Activity context;
@ -41,16 +37,6 @@ public class ImageRecyclerViewAdapter extends RecyclerView.Adapter<ImageRecycler
this.favoriteImageDao = db.favoriteImageDao();
}
// 更新数据并使用 DiffUtil
public void updateImagePaths(List<String> 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<ImageRecycler
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
String imagePath = imagePaths.get(position);
Glide.with(context)
.load("file:///android_asset/" + imagePath)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(holder.imageView);
RequestOptions requestOptions = new RequestOptions()
.transform(new CenterCrop(), new RoundedCorners(20)); // 20 是圆角半径
if (imagePath.startsWith("/data/user/")) {
Glide.with(context)
.load(imagePath)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.apply(requestOptions)
.into(holder.imageView);
} else {
Glide.with(context)
.load("file:///android_asset/" + imagePath)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.apply(requestOptions)
.into(holder.imageView);
}
Executors.newSingleThreadExecutor().execute(() -> {
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<ImageRecycler
return imagePaths.size();
}
private boolean checkFavoriteStatus(String imagePath) {
FavoriteImage favoriteImage = favoriteImageDao.getByImagePath(imagePath);
return favoriteImage != null;
}
private void updateDatabase(String imagePath, boolean isFavorite) {
Executors.newSingleThreadExecutor().execute(() -> {
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<String> newImagePaths) {
imagePaths = newImagePaths;
notifyDataSetChanged();
}
static class ViewHolder extends RecyclerView.ViewHolder {
ImageView imageView;
ImageView favoriteButton;
@ -97,86 +129,4 @@ public class ImageRecyclerViewAdapter extends RecyclerView.Adapter<ImageRecycler
}
}
private static class MyDiffCallback extends DiffUtil.Callback {
private List<String> oldItems;
private List<String> newItems;
MyDiffCallback(List<String> oldItems, List<String> 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<FavoriteImage> favoriteImageLiveData = favoriteImageDao.getFavoriteImageByPath(imagePath);
favoriteImageLiveData.observe((LifecycleOwner) context, new Observer<FavoriteImage>() {
@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);
});
}
}

View File

@ -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<FavoriteAdapter.ImageV
String imagePath = favoriteImage.getImagePath();
boolean isFavorite = favoriteImage.isFavorite();
RequestOptions requestOptions = new RequestOptions()
.transform(new CenterCrop(), new RoundedCorners(20)); // 20 是圆角半径
Glide.with(context)
.load(imagePath.startsWith("/data/user/") ? imagePath : "file:///android_asset/" + imagePath)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.apply(requestOptions)
.into(holder.imageView);
holder.favoriteButton.setImageResource(isFavorite ? R.drawable.favorite : R.drawable.unfavorite);
@ -140,7 +147,4 @@ public class FavoriteAdapter extends RecyclerView.Adapter<FavoriteAdapter.ImageV
favoriteButton = itemView.findViewById(R.id.btn_favorite);
}
}
}

View File

@ -1,257 +1,257 @@
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<ImportListAdapter.ImageViewHolder> {
private List<String> imagePaths;
private List<String> imagePathsOld;
private final FavoriteImageDao favoriteImageDao;
private final Activity context;// 图片路径列表
public ImportListAdapter(List<String> imagePaths, Activity context) {
this.imagePaths = imagePaths;
this.context = context;
AppDatabase db = AppDatabase.getInstance(context);
this.favoriteImageDao = db.favoriteImageDao(); // 初始化 DAO
}
// 更新数据并使用 DiffUtil
public void updateImagePaths(List<String> 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<String> oldItems;
private List<String> newItems;
MyDiffCallback(List<String> oldItems, List<String> 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<FavoriteImage> favoriteImageLiveData = favoriteImageDao.getFavoriteImageByPath(imagePath);
favoriteImageLiveData.observe((LifecycleOwner) context, new Observer<FavoriteImage>() {
@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<Void, Void, Boolean> {
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<ImportListAdapter.ImageViewHolder> {
//
// private List<String> imagePaths;
//
// private List<String> imagePathsOld;
// private final FavoriteImageDao favoriteImageDao;
// private final Activity context;// 图片路径列表
//
// public ImportListAdapter(List<String> imagePaths, Activity context) {
// this.imagePaths = imagePaths;
// this.context = context;
// AppDatabase db = AppDatabase.getInstance(context);
// this.favoriteImageDao = db.favoriteImageDao(); // 初始化 DAO
// }
//
// // 更新数据并使用 DiffUtil
// public void updateImagePaths(List<String> 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<String> oldItems;
// private List<String> newItems;
//
// MyDiffCallback(List<String> oldItems, List<String> 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<FavoriteImage> favoriteImageLiveData = favoriteImageDao.getFavoriteImageByPath(imagePath);
// favoriteImageLiveData.observe((LifecycleOwner) context, new Observer<FavoriteImage>() {
// @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<Void, Void, Boolean> {
// 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); // 更新按钮图标为收藏状态
// }
// }
// }
//
//}

View File

@ -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<String> 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);

View File

@ -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<String> oldList, List<String> newList) {
return new DiffUtil.Callback() {
@Override
public int getOldListSize() {
return oldList.size();
}
private final List<String> oldList;
private final List<String> newList;
@Override
public int getNewListSize() {
return newList.size();
}
public DiffUtilUtils(List<String> oldList, List<String> 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));
}
}

View File

@ -1,4 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:drawable="@drawable/favorite"/>
<item android:drawable="@drawable/unfavorite"/>
</selector>

View File

@ -5,5 +5,5 @@
android:viewportHeight="20">
<path
android:pathData="M19.991,7.046C19.991,3.719 17.38,1.012 14.175,1.012C12.592,1.012 11.094,1.695 10.013,2.86C8.93,1.695 7.43,1.012 5.85,1.012C2.644,1.012 0.034,3.718 0.034,7.046C0.034,7.158 0.045,7.257 0.054,7.339C0.052,7.366 0.051,7.393 0.051,7.421C0.051,8.01 0.193,8.657 0.475,9.345C0.483,9.37 0.492,9.394 0.503,9.416C2.275,13.667 9.096,18.557 9.386,18.782C9.566,18.92 9.781,18.989 9.996,18.989C10.215,18.989 10.431,18.917 10.612,18.776C10.861,18.582 16.679,14.394 18.988,10.432C19.076,10.299 19.142,10.169 19.2,10.057C19.218,10.022 19.234,9.986 19.253,9.952L19.261,9.935C19.268,9.922 19.277,9.907 19.286,9.895C19.424,9.626 19.534,9.376 19.622,9.132C19.862,8.504 19.979,7.945 19.979,7.423C19.979,7.382 19.978,7.347 19.975,7.317C19.982,7.248 19.991,7.156 19.991,7.046Z"
android:fillColor="#F7F8FA"/>
android:fillColor="#ACB3C1"/>
</vector>

View File

@ -7,34 +7,34 @@
<androidx.cardview.widget.CardView
android:id="@+id/card"
android:layout_width="156dp"
android:layout_height="156dp"
android:layout_height="135dp"
app:cardCornerRadius="16dp">
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/image_view"
android:layout_width="156dp"
android:layout_height="156dp"
android:layout_centerHorizontal="true"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true"
android:padding="12dp"
android:background="@drawable/rounded_corners" />
<ImageView
android:id="@+id/btn_favorite"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_alignTop="@id/image_view"
android:layout_alignEnd="@id/image_view"
android:padding="6dp"
android:scaleType="fitXY"
android:src="@drawable/unfavorite" />
android:layout_marginTop="6dp"
android:layout_marginEnd="6dp"
android:src="@drawable/selector_favorite" />
</RelativeLayout>
</androidx.cardview.widget.CardView>
</RelativeLayout>