WallpaperGallery-com.galler.../app/src/main/java/com/gallery/free/wallpaper/WpPagerAdapter.kt
2026-01-04 15:23:26 +08:00

162 lines
6.9 KiB
Kotlin
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.gallery.free.wallpaper
import android.annotation.SuppressLint
import android.graphics.drawable.Drawable
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.engine.GlideException
import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.target.CustomTarget
import com.bumptech.glide.request.target.Target
class WpPagerAdapter(
private val wallpaperItems: List<WpItem>,
private val loadListener: OnImageLoadListener? = null // 添加加载监听器
) : RecyclerView.Adapter<WpPagerAdapter.ViewHolder>() {
// 添加加载监听接口
interface OnImageLoadListener {
fun onImageLoadSuccess(position: Int)
fun onImageLoadFailed(position: Int, error: Throwable)
}
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val imageView: ImageView = itemView.findViewById(R.id.pager_image_view)
val loadingProgress: ImageView = itemView.findViewById(R.id.loading_progress)
// 添加标识防止错乱的UI更新
var currentPosition: Int = -1
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.item_wp_pager, parent, false)
return ViewHolder(view)
}
@SuppressLint("RecyclerView")
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val wallpaperItem = wallpaperItems[position]
Log.d("WallpaperPagerAdapter", "onBindViewHolder position=$position")
// 设置当前position标识
holder.currentPosition = position
// 1. 立即显示loading
holder.loadingProgress.visibility = View.VISIBLE
holder.loadingProgress.bringToFront()
// 2. 立即显示smallUrl使用单独的Target
val smallUrlTarget = object : CustomTarget<Drawable>() {
override fun onResourceReady(
resource: android.graphics.drawable.Drawable,
transition: com.bumptech.glide.request.transition.Transition<in android.graphics.drawable.Drawable>?
) {
Log.d("WallpaperPagerAdapter", "smallUrl加载完成 position=$position")
// 确保还是当前position
if (holder.currentPosition == position) {
holder.imageView.setImageDrawable(resource)
}
}
override fun onLoadCleared(placeholder: android.graphics.drawable.Drawable?) {
// 清理资源
}
override fun onLoadFailed(errorDrawable: android.graphics.drawable.Drawable?) {
Log.e("WallpaperPagerAdapter", "smallUrl加载失败 position=$position")
if (holder.currentPosition == position && holder.itemView.isAttachedToWindow) {
holder.imageView.setBackgroundColor(R.color.light_gray)
holder.imageView.setImageResource(R.drawable.ic_loadingpic_failed)
holder.imageView.scaleType = ImageView.ScaleType.CENTER
}
}
}
// 先清除可能的错误状态
holder.imageView.setBackgroundColor(0x00000000)
holder.imageView.scaleType = ImageView.ScaleType.CENTER_CROP
Glide.with(holder.itemView.context)
.load(wallpaperItem.smallUrl)
.dontAnimate()
.skipMemoryCache(true) // 跳过内存缓存,确保每次都触发回调
.into(smallUrlTarget)
// 3. 加载fullUrl
Glide.with(holder.itemView.context)
.load(wallpaperItem.fullUrl)
.dontAnimate()
.diskCacheStrategy(com.bumptech.glide.load.engine.DiskCacheStrategy.ALL)
.listener(object : RequestListener<android.graphics.drawable.Drawable> {
override fun onLoadFailed(
e: GlideException?,
model: Any?,
target: Target<android.graphics.drawable.Drawable>?,
isFirstResource: Boolean
): Boolean {
Log.e("WallpaperPagerAdapter", "fullUrl加载失败 position=$position: ${e?.message}")
if (holder.currentPosition == position && holder.itemView.isAttachedToWindow) {
holder.loadingProgress.visibility = View.GONE
// 自定义错误显示:设置灰色背景和居中图标
holder.imageView.setBackgroundColor(R.color.light_gray)
holder.imageView.setImageResource(R.drawable.ic_loadingpic_failed)
holder.imageView.scaleType = ImageView.ScaleType.CENTER
}
// 通知加载失败
loadListener?.onImageLoadFailed(position, e ?: Exception("图片加载失败"))
return true
}
override fun onResourceReady(
resource: android.graphics.drawable.Drawable?,
model: Any?,
target: Target<android.graphics.drawable.Drawable>?,
dataSource: DataSource?,
isFirstResource: Boolean
): Boolean {
Log.d("WallpaperPagerAdapter", "fullUrl加载完成 position=$position")
if (holder.currentPosition == position && holder.itemView.isAttachedToWindow) {
holder.loadingProgress.visibility = View.GONE
// 清除可能的错误状态
holder.imageView.setBackgroundColor(0x00000000) // 透明背景
holder.imageView.scaleType = ImageView.ScaleType.CENTER_CROP // 恢复原来的缩放模式
}
// 通知加载成功
loadListener?.onImageLoadSuccess(position)
return false
}
})
.into(holder.imageView)
}
override fun onViewRecycled(holder: ViewHolder) {
super.onViewRecycled(holder)
// 清理ImageViewGlide会自动取消相关请求
Glide.with(holder.itemView.context).clear(holder.imageView)
// 重置标识
holder.currentPosition = -1
}
override fun getItemCount(): Int = wallpaperItems.size
// 添加重新加载方法
fun retryLoadImage(position: Int) {
notifyItemChanged(position)
}
fun clearAllCache() {
// 如果确实需要清除所有缓存可以在Activity中调用但通常不需要手动清理
// Glide.get(context).clearMemory()
}
}