Glide加载图片仅在滚动GridView后显示的问题求助
问题
基于TMDB开发影视功能时,Fragment加载并填充GridView适配器后,图片加载无报错,但必须向下滚动GridView几行再返回才能看到图片。滚动前图片不显示,滚动后所有图片才出现。
适配器代码如下:
package com.rwsw.livesofa.tv.gridviews; import android.content.Context; import android.graphics.drawable.Drawable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.Nullable; import com.bumptech.glide.Glide; import com.bumptech.glide.Priority; import com.bumptech.glide.load.DataSource; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.load.engine.GlideException; import com.bumptech.glide.request.RequestListener; import com.bumptech.glide.request.target.Target; import com.rwsw.livesofa.R; import com.rwsw.livesofa.models.MovieModel; import com.rwsw.livesofa.tv.fragments.FragmentRecommended; import java.util.ArrayList; import java.util.HashMap; public class Grid_View_Recommended extends BaseAdapter { Context context; LayoutInflater inflater; private static ArrayList<MovieModel> movieModelList; MovieModel resultp; public Grid_View_Recommended(Context context, ArrayList<MovieModel> arraylist) { this.context = context; movieModelList = arraylist; } public class ViewHolder { public ImageView poster; } @Override public int getCount() { return movieModelList.size(); } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } public View getView(final int position, View convertView, ViewGroup parent) { View itemView = convertView; Grid_View_Recommended.ViewHolder holder; if (convertView == null) { inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); itemView = inflater.inflate(R.layout.item_movie, parent, false); holder = new ViewHolder(); holder.poster = (ImageView) itemView.findViewById(R.id.poster); itemView.setTag(holder); } else { holder = (Grid_View_Recommended.ViewHolder) itemView.getTag(); resultp = movieModelList.get(position); Glide.with(context) .asBitmap() .load("https://image.tmdb.org/t/p/w342" + resultp.getPosterPath()) .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC) .into(holder.poster); } return itemView; } }
已尝试以Bitmap方式加载、更换缓存策略,问题仍未解决。
解决方案
问题根源
- 图片加载逻辑遗漏:
getView方法中仅在复用View(convertView != null)时执行Glide加载,首次创建View(convertView == null)时未加载对应位置的图片,导致初始显示的item无图。 - 适配器核心方法未规范实现:
getItem和getItemId返回null和0,不符合BaseAdapter规范,可能干扰视图复用逻辑。
修改后的代码
package com.rwsw.livesofa.tv.gridviews; import android.content.Context; 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.load.engine.DiskCacheStrategy; import com.rwsw.livesofa.R; import com.rwsw.livesofa.models.MovieModel; import java.util.ArrayList; public class Grid_View_Recommended extends BaseAdapter { Context context; private ArrayList<MovieModel> movieModelList; public Grid_View_Recommended(Context context, ArrayList<MovieModel> arraylist) { this.context = context; this.movieModelList = arraylist; } public class ViewHolder { public ImageView poster; } @Override public int getCount() { return movieModelList.size(); } @Override public Object getItem(int position) { return movieModelList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.item_movie, parent, false); holder = new ViewHolder(); holder.poster = convertView.findViewById(R.id.poster); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } // 统一处理图片加载,覆盖首次创建和复用场景 MovieModel resultp = movieModelList.get(position); String imageUrl = "https://image.tmdb.org/t/p/w342" + resultp.getPosterPath(); Glide.with(context) .asBitmap() .load(imageUrl) .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC) .into(holder.poster); return convertView; } }
关键修改点
- 将Glide加载逻辑移至
if-else代码块外部,确保每个item无论首次创建还是复用,都会加载对应位置的图片。 - 修正
getItem和getItemId方法,返回正确的数据和位置ID,符合适配器规范。 - 移除不必要的全局变量,优化代码结构,避免变量复用导致的逻辑混乱。
内容的提问来源于stack exchange,提问作者Inside 4ndroid
相关产品推荐
相关产品推荐

