You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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方式加载、更换缓存策略,问题仍未解决。

解决方案

问题根源

  1. 图片加载逻辑遗漏:getView方法中仅在复用View(convertView != null)时执行Glide加载,首次创建View(convertView == null)时未加载对应位置的图片,导致初始显示的item无图。
  2. 适配器核心方法未规范实现: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 22:10:11