网格视图库从SD卡读取

时间:2014-02-26 15:25:18

标签: java android eclipse gridview

我有一个网格视图,可以将特定文件夹中的所有图像加载到自身中。我试图得到它,以便当用户单击网格视图中的单个图像时,它在图像视图中设置自身的放大版本。我认为我需要尝试做的是在创建网格视图并将图像加载到其中时,我需要将数组附加到在gridview中保存图像的imageview以及它在SD卡中的位置。所以当加载图像时;保存图像的位置并将其附加到gridview中的imageview。到目前为止,我将从SD卡加载的最后一张照片加载到放大的图像视图中。

Main.java

public class Main extends Activity{

ImageView photoHolder;

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.gallery);


    photoHolder = (ImageView) findViewById(R.id.photoHolderView);
    photoHolder.setVisibility(View.GONE);
    GridView gridView = (GridView) findViewById(R.id.grid_view);
    gridView.setVisibility(View.VISIBLE);
    gridView.setAdapter(new ImageAdapter(this));
    gridView.setOnItemClickListener(new OnItemClickListener() 
    {
        @Override
        public void onItemClick(AdapterView<?> a, View view, int position, long id) {

            photoHolder.setVisibility(View.VISIBLE);
            photoHolder.setImageURI(ImageAdapter.uri);


    }
});
}

}

ImageAdapter.java

public class ImageAdapter extends BaseAdapter {

public static Uri uri;

private Context mContext;
File root = new File(Environment.getExternalStorageDirectory()
        + File.separator + "Custom" + File.separator);
private File[] fileName = root.listFiles();
int count = fileName.length;

public ImageAdapter(Context c) {
    mContext = c;
}

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

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

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

// create a new ImageView for each item referenced by the Adapter
public View getView(int position, View convertView, ViewGroup parent) {

    uri = Uri.fromFile(fileName[position]);

    ImageView imageView;
    if (convertView == null) { // if it's not recycled, initialize some
                                // attributes
        imageView = new ImageView(mContext);
        imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
        imageView.setPadding(8, 8, 8, 8);
    } else {
        imageView = (ImageView) convertView;
    }

    imageView.setImageURI(uri);
    return imageView;
}
}

另一方面,由于内存泄漏,它崩溃了很多,不知道如何在从SD卡加载时创建“样本/缩略图”大小的图像?

1 个答案:

答案 0 :(得分:0)

您说得对,需要跟踪每个缩略图的文件/位置。最简单的方法是修改getView方法并添加一行:

imageView.setImageURI(uri);
imageView.setTag(uri);   //new line added
return imageView;

然后,在onItemClickListener中,您获得点击的图片查看 - 并获取其标记 - 这将是SD卡上的文件名:

public void onItemClick(AdapterView<?> a, View view, int position, long id) {

    photoHolder.setVisibility(View.VISIBLE);
    photoHolder.setImageURI((Uri)view.getTag());
}

至于加载位图时的内存问题,您可以使用BitmapFactory.Options来指示缩放系数 - 在Android开发者网站上查看this page - 它包含您需要的示例代码。 / p>