Java 在android的自定义GridView中使用毕加索库

Java 在android的自定义GridView中使用毕加索库,java,android,gridview,Java,Android,Gridview,我正在处理一个项目,其中有一个自定义gridview,其中包含一个图像和一个文本视图。我正在尝试使用毕加索库从url加载图像。我面临的问题是: 加载图像后,我滚动网格查看列表底部的图像,它会继续加载。但当我滚动回顶部时,已经加载的图像会再次开始加载。为什么顶部的图像不会保持固定?为什么它们会再次开始加载? 我的代码如下所示: 在其中设置图像的适配器: public class CustomGridAdapter extends BaseAdapter { private Context

我正在处理一个项目,其中有一个自定义gridview,其中包含一个图像和一个文本视图。我正在尝试使用毕加索库从url加载图像。我面临的问题是:

加载图像后,我滚动网格查看列表底部的图像,它会继续加载。但当我滚动回顶部时,已经加载的图像会再次开始加载。为什么顶部的图像不会保持固定?为什么它们会再次开始加载?

我的代码如下所示:

在其中设置图像的适配器:

public class CustomGridAdapter extends BaseAdapter {
    private Context mContext;
   ArrayList<Sports_data> list;
    LayoutInflater mInflater;
    public ImageLoader imageLoader; 
      public CustomGridAdapter(Context c,ArrayList<Sports_data> list ) {
          mContext = c;
          this.list=list;
          mInflater= (LayoutInflater) mContext.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
          imageLoader=new ImageLoader(c);
      }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        GridHolder holder=null;
        if(convertView==null)
            {
            convertView = mInflater.inflate(R.layout.grid_single,parent,false);
            holder=new GridHolder();
            holder.gridimage=(ImageView) convertView.findViewById(R.id.grid_image);
            holder.txtgrid=(TextView) convertView.findViewById(R.id.grid_text);
            convertView.setTag(holder);
            }
        else
        {
            holder = (GridHolder) convertView.getTag();
        }
        //holder.gridimage.setImageResource(R.drawable.ic_launcher);
        holder.txtgrid.setText(list.get(position).sports_name);
        //imageLoader.DisplayImage(list.get(position).sports_image_url, holder.gridimage);  
        Picasso.with(mContext).load(list.get(position).sports_image_url).noFade().into(holder.gridimage);

        return convertView;
    }

    public class GridHolder
    {
        ImageView gridimage;
        TextView txtgrid;
    }

}

请帮忙

在我的应用程序中,我使用AsyncTask将图像加载到GridView中,它看起来与您描述的方式完全相同

我认为这是GridView/ListView回收屏幕上看不到的图像的本质。如果GridView/ListView在上下滚动时没有这样做,分配给应用程序的内存将很快耗尽,导致崩溃

您的问题的解决方案可能是将加载(下载)的图像缓存到内存/磁盘中,然后使用它们,而不是再次重新加载

请看我参加的培训:


不幸的是,我跳过了缓存位图的部分,因此我无法向您提供任何代码。

您需要在GridHolder类中创建一个构造函数。在这里,您需要为希望视图持有者缓存的每个视图调用findViewById()。这样做:

class GridHolder {
    ImageView gridimage;
    TextView txtgrid;

    public GridHolder(View itemView) {
        gridimage= (ImageView) itemView.findViewById(R.id.grid_image);
        txtgrid= (TextView) itemView.findViewById(R.id.grid_text);
    }
}

您在清单中有什么权限?我应该有写外部存储权限吗?请尝试为外部存储添加写和读。@Niko如果您添加写权限,您不必添加读权限,因为write include read.hay@AchuthanM我面临同样的问题。如果您找到了解决方案,请发布它
class GridHolder {
    ImageView gridimage;
    TextView txtgrid;

    public GridHolder(View itemView) {
        gridimage= (ImageView) itemView.findViewById(R.id.grid_image);
        txtgrid= (TextView) itemView.findViewById(R.id.grid_text);
    }
}