2010-05-02 2 views
9

Ho lavorato alla creazione di una vista a griglia di immagini, con immagini presenti nella cartella Risorse. Il collegamento Opening a File from assets folder in android mi ha aiutato a utilizzare la bitmap per leggerlo. Il codice attualmente sto avendo è:Android - Immagini dalla cartella Risorse in una GridView

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

    try 
    { 
    AssetManager am = mContext.getAssets(); 
    String list[] = am.list(""); 
    int count_files = imagelist.length; 
    for(int i= 0;i<=count_files; i++) 
    { 
     BufferedInputStream buf = new BufferedInputStream(am.open(list[i])); 
     Bitmap bitmap = BitmapFactory.decodeStream(buf); 
     imageView.setImageBitmap(bitmap); 
     buf.close(); 
    } 
    } 
    catch (IOException e) 
    { 
    e.printStackTrace(); 
    } 
    } 

La mia applicazione fa leggere l'immagine dalla cartella Assets, ma non è scorrendo le celle nella vista Griglia. Tutte le celle della vista griglia hanno una stessa immagine selezionata dal set di immagini. Qualcuno può dirmi come iterare attraverso le celle e avere ancora immagini diverse?

Ho il codice di cui sopra in una classe ImageAdapter che estende la classe BaseAdapter, e nella mia classe principale stanno collegando che con il mio gridview da:

GridView gv =(GridView)findViewById(R.id.gridview); 
    gv.setAdapter(new ImageAdapter(this, assetlist));  

Grazie mille per qualsiasi aiuto in anticipo, Saran

+0

C'è un motivo particolare per cui si inseriscono questi in "assets /' piuttosto che come risorse disegnabili? – CommonsWare

+0

In realtà voglio caricare queste immagini in modo dinamico, e sono molte di numero. Quando li ho avuti in risorse, ho avuto problemi di memoria.ContentProvider stava diventando un po 'fuori mano, quindi ho pensato di provare le risorse. - Saran – Saran

risposta

3

Non è necessario leggere tutti gli elementi ogni volta. Leggi solo l'articolo nella posizione indicata nella chiamata al metodo getView. E mostra solo quell'elemento in quel momento.

BufferedInputStream buf = new BufferedInputStream(am.open(list[position])); 
19

Saran, di seguito è quello che uso per mostrare le immagini nella cartella delle risorse con la galleria. Immagino che sia lo stesso affare con un gridview:

public class myActivitye extends Activity 
{ 
    private Gallery mGallery; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     mGallery = (Gallery) findViewById(R.id.mygalleryinxml); 

     //load images into memory 
     mBitArray = new Bitmap[4]; 
     try 
     { 
      //these images are stored in the root of "assets" 
      mBitArray[0] = getBitmapFromAsset("pic1.png"); 
      mBitArray[1] = getBitmapFromAsset("pic2.png"); 
      mBitArray[2] = getBitmapFromAsset("pic3.png"); 
      mBitArray[3] = getBitmapFromAsset("pic4.png"); 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 

     mGallery.setAdapter(new GalleryAdapter(this, mBitArray)); 
    } 

    public class GalleryAdapter extends BaseAdapter 
    { 
     //member variables 
     private Context mContext; 
     private Bitmap[] mImageArray; 

     //constructor 
     public GalleryAdapter(Context context, Bitmap[] imgArray) 
     { 
      mContext = context; 
      mImageArray = imgArray; 
     } 

     public int getCount() 
     { 
      return mImageArray.length; 
     } 

     public Object getItem(int position) 
     { 
      return position; 
     } 

     public long getItemId(int position) 
     { 
      return position; 
     } 

     //returns the individual images to the widget as it requires them 
     public View getView(int position, View convertView, ViewGroup parent) 
     { 
      final ImageView imgView = new ImageView(mContext); 

      imgView.setImageBitmap(mImageArray[position]); 

      //put black borders around the image 
      final RelativeLayout borderImg = new RelativeLayout(mContext); 
      borderImg.setPadding(20, 20, 20, 20); 
      borderImg.setBackgroundColor(0xff000000);//black 
      borderImg.addView(imgView); 
      return borderImg; 
     } 

    }//end of: class GalleryAdapter 


    /** 
    * Helper Functions 
    * @throws IOException 
    */ 
    private Bitmap getBitmapFromAsset(String strName) throws IOException 
    { 
     AssetManager assetManager = getAssets(); 

     InputStream istr = assetManager.open(strName); 
     Bitmap bitmap = BitmapFactory.decodeStream(istr); 
     istr.close(); 

     return bitmap; 
    } 
} 
+0

a proposito, dal momento che si desidera caricare le immagini in modo dinamico (io li ho codificati nel mio esempio), se fossi in te metterei le immagini in una cartella di "risorse" e quindi utilizzare am.list (" [nome della cartella] "); questo perché ho visto i file Android all'interno delle risorse in aggiunta ai miei file. –

+1

Il metodo getBitmapFromAsset() sta trascurando di chiudere l'InputStream che apre. –

+0

Grazie !! Ho aggiornato il mio codice di esempio –