2011-05-12 88 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