2015-09-08 43 views
0

我试图用从网上加载的拇指图像来构建gridview。 我所拥有的是一个url数组,然后传递给一个适配器customgrid(代码如下)。 位图的下载是通过异步任务完成的。 最终的结果是,在15个图像中,只有2个实际显示,其他13个不显示(但它们都存在,并且我尝试了所有这些都使用相同的URL,这仍然会发生。 。 How it looks currentlyAndroid gridview与来自网址的图像

有任何被抛出任何错误 任何帮助,将不胜感激

CustomGrid.Java类:。

public class CustomGrid extends BaseAdapter{ 

private Context mContext; 
private final String[] web; 
private final String[] ImageUrl; 
ImageView imageView; 
Bitmap bitmap; 



public CustomGrid(Context c,String[] web,String[] ImageUrl) { 
    mContext = c; 
    this.ImageUrl = ImageUrl; 
    this.web = web; 
} 

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

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

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

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View grid; 
    LayoutInflater inflater = (LayoutInflater) mContext 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    if (convertView == null) { 
     grid = new View(mContext); 
     grid = inflater.inflate(R.layout.gallery_item, null); 
     imageView = (ImageView)grid.findViewById(R.id.grid_image); 

     try 
     { 
      new LoadImage().execute(ImageUrl[position]); 

     }catch (Exception e) { 

      e.printStackTrace(); 
     } 


    } else { 
     grid = (View) convertView; 
    } 

    return grid; 
} 

private class LoadImage extends AsyncTask<String, String, Bitmap> { 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 


    } 

    protected Bitmap doInBackground(String... args) { 
     try { 
      bitmap = BitmapFactory.decodeStream((InputStream)new URL(args[0]).getContent()); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return bitmap; 
    } 

    protected void onPostExecute(Bitmap image) { 


     if(image != null){ 
      imageView.setImageBitmap(image); 
     }else{ 

     } 
    } 
} 

} 

主要活动ç加载图像颂歌:(网络仅仅是串并的ImageUrl数组与URL的图像阵列)

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    getLayoutInflater().inflate(R.layout.activity_trips_and_activities, frameLayout); 

    CustomGrid adapter = new CustomGrid(TripsAndActivities.this, web, imageUrl); 
    grid=(GridView)findViewById(R.id.grid); 
    grid.setAdapter(adapter); 
    grid.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, 
           int position, long id) { 
      Toast.makeText(TripsAndActivities.this, "You Clicked at " + web[+position], Toast.LENGTH_SHORT).show(); 

     } 
    }); 

} 
+0

匆匆一瞥,我会说你的'GetView'在else部分是错误的。如果视图不为空(您应该设置图像或其他位置),则不设置任何内容。不是说它会解决你所有的问题,但也许是一个。 – Johan

+0

另外,你在哪里设置'imageView'的图像? – Johan

+0

谢谢,但这不会是一个问题。该位代码实际上从未被命中,并且该位与新的LoadImage()。execute(ImageUrl [position]); 被称为15次(这是我试图加载的图像数量)。 –

回答

0

你所面临的问题,是你的imageView变量被改变(在你循环)并获取图像异步。

当你得到图像时,你的imageView指向一个不同的元素。

请尝试以下

class BitmapWorkerTask extends AsyncTask<String, String, Bitmap> { 
    private final WeakReference<ImageView> imageViewReference; 

    public BitmapWorkerTask(ImageView imageView) { 
     // Use a WeakReference to ensure the ImageView can be garbage collected 
     imageViewReference = new WeakReference<ImageView>(imageView); 
    } 

    // Decode image in background. 
    @Override 
    protected Bitmap doInBackground(String... args) { 
     try { 
      bitmap = BitmapFactory.decodeStream((InputStream)new URL(args[0]).getContent()); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return bitmap; 
    } 

    // Once complete, see if ImageView is still around and set bitmap. 
    @Override 
    protected void onPostExecute(Bitmap bitmap) { 
     if (imageViewReference != null && bitmap != null) { 
      final ImageView imageView = imageViewReference.get(); 
      if (imageView != null) { 
       imageView.setImageBitmap(bitmap); 
      } 
     } 
    } 
} 

然后,您将需要使用它像这样

BitmapWorkerTask task = new BitmapWorkerTask(imageView); 
    task.execute(ImageUrl[position]); 

或者你现在把它写

new BitmapWorkerTask(imageView).execute(ImageUrl[position]); 

此外,重构你的GetView的东西像这样

var view = convertView; 
if (view == null) { 
    view = inflater.inflate(R.layout.gallery_item, null); 
} 

var myImageView = (ImageView)view.findViewById(R.id.grid_image); 

try { 
    //You can further optimize the code, by storing the bitmap is some 
    //cache, so when the user scrolls away, it doesn't throw the image 
    //away but keeps it for reuse once they scroll back. 
    new LoadImage(myImageView).execute(ImageUrl[position]); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

return view; 
+1

谢谢,这已经解决了这个问题:) –

+0

不知道我提到的另一个问题(当你有更多的图像比屏幕可以容纳,你需要滚动)。 – Johan

+0

我目前有超过屏幕搁置,但似乎工作正常。 –