2011-05-12 56 views
0

我加载图像在gridviev asynchronusly.But我gridview只显示单个图像在gridview.My适配器类和asynchronus类的最后一个单元格下面给出,谢谢。asynchronus图像加载gridview

适配器类:

class OrderAdapter extends ArrayAdapter<String> 
{ 
    LayoutInflater inflater; 

    String name3[]; 
    public OrderAdapter(Context context,int resource,LayoutInflater inflater,String name2[]) 
    { 
     super(context, resource,R.id.img,name2); 
     this.inflater=inflater; 
     this.name3=name2; 
    } 
    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     View row=inflater.inflate(R.layout.row,parent,false); 
     final ImageView img=(ImageView)row.findViewById(R.id.img); 
     String imgurl=name3[position]; 
     Log.e("urlchandan",name3[position]); 
     AsyncImageLoaderv asyncImageLoaderv=new AsyncImageLoaderv(); 
     Bitmap cachedImage = asyncImageLoaderv.loadDrawable(imgurl, new AsyncImageLoaderv.ImageCallback() 
      { 
      public void imageLoaded(Bitmap imageDrawable, String imageUrl) { 
      img.setImageBitmap(imageDrawable); 

      } 
      }); 
     img.setImageBitmap(cachedImage);  

     return row; 
    } 

} 

异步类

public class AsyncImageLoaderv { 
    private HashMap<String, SoftReference<Bitmap>> imageCache; 

    public AsyncImageLoaderv() { 
     imageCache = new HashMap<String, SoftReference<Bitmap>>(); 
    } 

    public Bitmap loadDrawable(final String imageUrl, final ImageCallback imageCallback) { 
     if (imageCache.containsKey(imageUrl)) { 
      SoftReference<Bitmap> softReference = imageCache.get(imageUrl); 
      Bitmap drawable = softReference.get(); 
      if (drawable != null) { 
       return drawable; 
      } 
     } 
     final Handler handler = new Handler() { 
      @Override 
       public void handleMessage(Message message) { 
        imageCallback.imageLoaded((Bitmap) message.obj, imageUrl); 
       } 
     }; 
     new Thread() { 
      @Override 
       public void run() { 
        try{ 
         Log.d("ur",imageUrl); 
         Bitmap drawable = loadImageFromUrl(imageUrl); 
         imageCache.put(imageUrl, new SoftReference<Bitmap>(drawable)); 
         Message message = handler.obtainMessage(0, drawable); 
         handler.sendMessage(message); 
        }catch(Exception e){Log.e("thread stellent",e.toString());} 
       } 
     }.start(); 
     return null; 
    } 


    public static Bitmap loadImageFromUrl(String url) { 
      InputStream inputStream;Bitmap b; 
      try { 
        inputStream = (InputStream) new URL(url).getContent(); 
        BitmapFactory.Options bpo= new BitmapFactory.Options(); 
        bpo.inSampleSize=2; 
        b=BitmapFactory.decodeStream(new PatchInputStream(inputStream), null,bpo); 
        return b; 
      } catch (IOException e) { 
        throw new RuntimeException(e); 
       } 
//return null; 
    } 

    public interface ImageCallback { 
     public void imageLoaded(Bitmap imageBitmap, String imageUrl); 
    } 
} 

回答

0

我通过在adatper inflater中将ImageView img作为final来解决问题,因为它避免了在gridview中的单个单元格中显示图像 。而我的图片是大尺寸的,并得到了错误解码器返回false,但此错误是由服用其他类

解决 -

import java.io.FilterInputStream; 
import java.io.IOException; 
import java.io.InputStream; 

public class PatchInputStream extends FilterInputStream { 
     public PatchInputStream(InputStream in) { 
     super(in); 
     } 
     public long skip(long n) throws IOException { 
     long m = 0L; 
     while (m < n) { 
      long _m = in.skip(n-m); 
      if (_m == 0L) break; 
      m += _m; 
     } 
     return m; 
     } 
    } 

这个类在上面给出AsyncImageLoaderv使用。

b=BitmapFactory.decodeStream(new PatchInputStream(inputStream), null,bpo); 
1

你不能这样做你想要的方式。您需要让异步加载器将结果图像存储在适配器可以按位置访问的某种数据结构中(例如列表,散列表等)。然后您的getView()应该简单地从正确的位置拉出图像。您的异步装载程序将填充数据结构并执行notifyDataSetChanged()以使列表重新绘制新图像。

+0

余马使用私有的HashMap <字符串,SoftReference的> imageCache存储image.view被称为对于每个元件和显示logcat中所有的URL Log.e( “urlchandan”,NAME3 [位置]);但它只调用一次或三次asyncImageLoaderv.loadDrawable()方法。 – kehnar 2011-05-12 15:29:21

+1

您的私有HashMap需要可以从适配器访问,并且它可以将视图中的图像设置为drawable,如果它被加载,或者如果它没有加载并且当前未加载,它可能会启动异步加载。您不能通过设置位图的回调来以现在的方式构建代码。 – 2011-05-12 16:09:15

+1

有关这种方法的示例,请参阅http://stackoverflow.com/questions/541966/android-how-do-i-do-a-lazy-load-of-i-f-in-listview/3068012#3068012。 – 2011-05-12 16:10:39