2014-09-03 149 views
0

我有一个图像url的数组,我想用Picasso下载图像并在网格视图中显示它们。我当前的实现工作,但它将最后一张图像放入网格视图的每个图像视图中。从数组填充GridView

public class GridViewAdapter extends ArrayAdapter { 

     Context context; 

     public GridViewAdapter(Context context) { 
      super(context, 0); 
      this.context = context; 
     } 

     public int getCount() { 
      return thumbnailURLS.size(); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 

      View row = convertView; 

      if(row == null) { 
       LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
       row = inflater.inflate(R.layout.grid_row, parent, false); 

       ImageView gridImageView = (ImageView)row.findViewById(R.id.gridImageView); 

       for(String s : thumbnailURLS) { 
        Picasso.with(context) 
          .load(s) 
          .placeholder(R.drawable.placeholder) 
          .error(R.drawable.placeholder) 
          .into(gridImageView); 
       } 
      } 

      return row; 
     } 
    } 

回答

1

为每个项目调用一次getView(即调用次数等于'getCount')。最简单的做法是放弃for循环并使用position参数查找thumbnailUrl。

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     View row = convertView; 

     if(row == null) { 
      LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
      row = inflater.inflate(R.layout.grid_row, parent, false); 
     } 

     ImageView gridImageView = (ImageView) row.findViewById(R.id.gridImageView); 

     Picasso.with(context) 
       .load(thumbnailURLs.get(position)) 
       .placeholder(R.drawable.placeholder) 
       .error(R.drawable.placeholder) 
       .into(gridImageView); 

     return row; 
    } 
1

你getView是每一个图像实际上加载到列表项,因此只有最后一个变成可见的一个!

正确的解决办法如下:

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

    View row = convertView; 
    if (row == null) { 
     LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
     row = inflater.inflate(R.layout.grid_row, parent, false); 
    } 

    ImageView gridImageView = (ImageView) row.findViewById(R.id.gridImageView); 
    Picasso.with(context).load(thumbnailURLS.get(position)).placeholder(R.drawable.placeholder) 
     .error(R.drawable.placeholder).into(gridImageView); 
    return row; 
    } 

你也应该考虑使用ViewHolder模式(http://developer.android.com/training/improving-layouts/smooth-scrolling.html#ViewHolder),使得你没有做一个findViewById每个getView被称为时间!

0

试试这个

// Get the image URL for the current position. 
String url = getItem(position); 

// Trigger the download of the URL asynchronously into the image view. 
Picasso.with(context) // 
    .load(url) // 
    .placeholder(R.drawable.placeholder) // 
    .error(R.drawable.error) // 
    .fit() // 
    .into(view);