2010-05-02 20 views
9

He estado trabajando en la creación de una vista de cuadrícula de imágenes, con las imágenes presentes en la carpeta de recursos. El enlace Opening a File from assets folder in android me ayudó a usar el mapa de bits para leerlo. El código estoy teniendo actualmente es:Android - Imágenes de la carpeta de recursos en un 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(); 
    } 
    } 

Mi aplicación no lee la imagen de la carpeta Activos, pero no se iteración a través de las células en la vista de cuadrícula. Todas las celdas de la vista de cuadrícula tienen una misma imagen seleccionada del conjunto de imágenes. ¿Alguien puede decirme cómo iterar a través de las celdas y aún tener imágenes diferentes?

que tienen el código anterior en una clase ImageAdapter que se extiende la clase BaseAdapter, y en mi clase principal Soy la vinculación que con mi gridview por:

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

Muchas gracias por cualquier ayuda de antemano, Saran

+0

¿Hay algún motivo en particular por el que los coloque en 'assets /' en lugar de como recursos dibujables? – CommonsWare

+0

En realidad, quiero cargar estas imágenes dinámicamente, y son muchas en número. Cuando los tenía en recursos, tenía un problema de memoria. ContentProvider estaba un poco fuera de control, así que pensé que probaría en recursos. - Saran – Saran

Respuesta

3

No es necesario leer todos los artículos todo el tiempo. Lea solo el elemento en la posición indicada en la llamada al método getView. Y solo muestra ese artículo ese momento.

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

Saran, a continuación se muestra lo que uso para mostrar imágenes en la carpeta de activos con la galería. Me imagino que es el mismo trato con una vista de cuadrícula:

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

por cierto, dado que desea cargar imágenes dinámicamente (las tengo codificadas en mi ejemplo), si fuera usted pondría las imágenes dentro de una carpeta de "assets" y luego usar am.list (" [su nombre de carpeta] "); esto es porque he visto archivos Android dentro de los activos además de mis propios archivos –

+1

El método getBitmapFromAsset() está dejando de cerrar el InputStream que se abre. –

+0

Gracias !! Actualicé mi código de muestra –

Cuestiones relacionadas