Android - 在GridView中显示来自Assets文件夹的图片

9

我一直在创建一张图片的网格视图,这些图片都存储在Assets文件夹中。 打开Android中Assets文件夹中的文件 这篇文章帮助我使用位图来读取它。我目前拥有的代码是:

 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();
   }
  }

我的应用程序可以从Assets文件夹读取图像,但它没有遍历网格视图中的单元格。网格视图的所有单元格都使用从图像集中选择的相同图像。有人能告诉我如何遍历单元格并仍然具有不同的图像吗?

我在一个ImageAdapter类中拥有上述代码,该类扩展了BaseAdapter类,在我的主类中,我通过以下方式将其与我的gridview链接:

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

提前感谢您的帮助,Saran


你把它们放在“assets/”文件夹里而不是作为可绘制资源,有特别的原因吗? - CommonsWare
实际上,我想动态加载这些图片,它们的数量很多。当我把它们放在资源中时,我遇到了内存问题。ContentProvider有点失控,所以我想尝试在assets中使用。- Saran - Saran
2个回答

19

以下是我用来在资产文件夹中使用画廊显示图片的代码,我想在网格视图中应该也是这样的:

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;
    }
}

顺便提一下,因为你想要动态加载图片(在我的示例中,它们是硬编码的),如果我是你,我会将图片放在“assets”文件夹中,然后使用am.list(“[你的文件夹名称]”);这是因为我看到了Android文件夹中除了自己的文件之外还有其他的文件。 - Someone Somewhere
1
方法getBitmapFromAsset()忽略了关闭它打开的InputStream。 - Paul LeBeau

3

不需要每次都阅读所有项目。只需阅读getView方法调用中给定位置的项目。并且仅在那个时间显示该项目。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接