IdleWall/app/src/main/java/com/idle/wall/RecentAdapter.java
2025-12-29 10:52:12 +08:00

186 lines
6.6 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.idle.wall;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.Priority;
import com.bumptech.glide.RequestBuilder;
import com.bumptech.glide.load.DecodeFormat;
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.bumptech.glide.request.RequestOptions;
import com.idle.wall.idleactivity.IdleWallActivity;
import com.idle.wall.idlebean.IdleData;
import com.idle.wall.idletool.Comutils;
import java.util.List;
import java.util.ArrayList;
public class RecentAdapter extends BaseAdapter {
private Context context;
private List<IdleWallpaper> wallpaperList = new ArrayList<>();
private LayoutInflater inflater;
private int itemWidth;
private final int cornerRadius = 12;
private RequestOptions glideOptions;
private RequestOptions preloadOptions;
private Handler mainHandler;
public RecentAdapter(Context context, List<IdleWallpaper> wallpaperList) {
this.context = context;
this.wallpaperList = (wallpaperList != null) ? wallpaperList : new ArrayList<>();
this.inflater = LayoutInflater.from(context);
this.mainHandler = new Handler(Looper.getMainLooper());
int screenWidth = context.getResources().getDisplayMetrics().widthPixels;
int columnCount = 2;
int spacing = (int) context.getResources().getDimension(R.dimen.grid_spacing);
this.itemWidth = (screenWidth - (columnCount + 1) * spacing) / columnCount;
// 优化后的Glide配置
initGlideOptions();
}
private void initGlideOptions() {
int radiusPx = dp2px(context, cornerRadius);
RoundedCorners roundedCorners = new RoundedCorners(radiusPx);
glideOptions = new RequestOptions()
.format(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ? DecodeFormat.PREFER_ARGB_8888 : DecodeFormat.PREFER_RGB_565)
.override(itemWidth, itemWidth)
.centerCrop()
.transform(roundedCorners)
.skipMemoryCache(false)
.priority(Priority.HIGH)
.timeout(5000)
.placeholder(R.mipmap.im_placeholder)
.error(R.mipmap.im_placeholder);
preloadOptions = new RequestOptions()
.override(itemWidth, itemWidth)
.centerCrop()
.transform(roundedCorners)
.priority(Priority.NORMAL)
.skipMemoryCache(false);
}
@Override
public int getCount() {
return wallpaperList.size();
}
@Override
public Object getItem(int position) {
return wallpaperList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.item_recent_wallpaper, parent, false);
holder = new ViewHolder();
holder.ivWallpaper = convertView.findViewById(R.id.iv_wallpaper);
ViewGroup.LayoutParams params = holder.ivWallpaper.getLayoutParams();
params.width = itemWidth;
params.height = itemWidth;
holder.ivWallpaper.setLayoutParams(params);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
IdleWallpaper wallpaper = wallpaperList.get(position);
String imagePath = wallpaper.getImageUrl();
// 优化后的图片加载逻辑
loadImageOptimized(holder.ivWallpaper, imagePath);
convertView.setOnClickListener(v -> {
IdleData idleData = new IdleData();
idleData.setImId(wallpaper.getId());
idleData.setFullUrl(wallpaper.getImageUrl());
idleData.setPreviewUrl400(wallpaper.getImageUrl());
idleData.setDescription(wallpaper.getTitle() != null ? wallpaper.getTitle() : "");
Intent intent = new Intent(context, IdleWallActivity.class);
intent.putExtra(Comutils.key_info, idleData);
context.startActivity(intent);
});
return convertView;
}
private void loadImageOptimized(ImageView imageView, String imageUrl) {
if (imageUrl == null || imageUrl.isEmpty()) {
Glide.with(context)
.load(R.mipmap.im_placeholder)
.into(imageView);
return;
}
RequestBuilder<Bitmap> thumbnailRequest = Glide.with(context)
.asBitmap()
.load(imageUrl)
.apply(RequestOptions.overrideOf(itemWidth / 4, itemWidth / 4)
.priority(Priority.IMMEDIATE));
Glide.with(context)
.asBitmap()
.load(imageUrl)
.apply(glideOptions)
.thumbnail(thumbnailRequest)
.into(imageView);
}
static class ViewHolder {
ImageView ivWallpaper;
}
public void updateData(List<IdleWallpaper> newList) {
this.wallpaperList = (newList != null) ? newList : new ArrayList<>();
notifyDataSetChanged();
mainHandler.postDelayed(() -> preloadImagesOptimized(5), 100);
}
private void preloadImagesOptimized(int count) {
if (wallpaperList.isEmpty() || context == null) return;
int preloadCount = Math.min(count, wallpaperList.size());
for (int i = 0; i < preloadCount; i++) {
String imageUrl = wallpaperList.get(i).getImageUrl();
if (imageUrl == null || imageUrl.isEmpty()) continue;
Glide.with(context)
.load(imageUrl)
.apply(preloadOptions)
.preload(itemWidth, itemWidth);
}
}
// 原有dp转px无修改
private int dp2px(Context context, int dp) {
float density = context.getResources().getDisplayMetrics().density;
return (int) (dp * density + 0.5f);
}
public void release() {
if (mainHandler != null) {
mainHandler.removeCallbacksAndMessages(null);
}
this.context = null;
}
}