Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从GridView中的缩略图展开图像_Android_Gridview_Android Gridview - Fatal编程技术网

Android 从GridView中的缩略图展开图像

Android 从GridView中的缩略图展开图像,android,gridview,android-gridview,Android,Gridview,Android Gridview,因此,我有一个简单的应用程序,我用相机拍摄图像,然后将图像加载到网格视图,当我单击网格视图时,它必须打开该图像的更大版本。我无法打开更大的图像 问题是,我在将该图像传递给活动时没有引用该图像,这会使图像变大。代码如下 MainActivity.java protected static final String EXTRA_RES_ID = "POS"; private ArrayList<String> mThumbIdsSelfies = new ArrayList<Str

因此,我有一个简单的应用程序,我用相机拍摄图像,然后将图像加载到
网格视图
,当我单击
网格视图
时,它必须打开该图像的更大版本。我无法打开更大的图像

问题是,我在将该图像传递给
活动时没有引用该图像,这会使图像变大。代码如下

MainActivity.java

protected static final String EXTRA_RES_ID = "POS";
private ArrayList<String> mThumbIdsSelfies = new ArrayList<String>();

if(populateArrayList())
{
    GridView gridview = (GridView) findViewById(R.id.gridview);

    // Create a new ImageAdapter and set it as the Adapter for this GridView
    gridview.setAdapter(new ImageAdapter(this, mThumbIdsSelfies));

    // Set an setOnItemClickListener on the GridView
    gridview.setOnItemClickListener(new AdapterView.OnItemClickListener()
    {
        public void onItemClick(AdapterView<?> parent, View v,
                                int position, long id)
        {

            //Create an Intent to start the ImageViewActivity
            Intent intent = new Intent(MainActivity.this, ImageViewActivity.class);

            // Add the ID of the thumbnail to display as an Intent Extra
            intent.putExtra(EXTRA_RES_ID, (int) id);

            // Start the ImageViewActivity
            startActivity(intent);
        }
    });
}

private boolean populateArrayList()
{
    File dir = getAlbumDir();
    //Bitmap myBitmap;

    if (dir.isDirectory())
    {
        File[] files = dir.listFiles();

        for (int i = 0; i < files.length; i++)
        {
            //myBitmap = BitmapFactory.decodeFile(files[i].toString());
            mThumbIdsSelfies.add(files[i].toString());
        }
    }

    return true;
}
String s = intent.getStringExtra(MainActivity.EXTRA_RES_ID);
Bitmap bitmap = BitmapFactory.decodeFile(s);
imageView.setImageBitmap(bitmap);
ImageAdapter.java

public class ImageAdapter extends BaseAdapter 
{
    private static final int PADDING = 8;
    private static final int WIDTH = 250;
    private static final int HEIGHT = 250;
    private Context mContext;
    private List<String> mThumbIds;

    // Store the list of image IDs
    public ImageAdapter(Context c, List<String> ids) 
    {
        mContext = c;
        this.mThumbIds = ids;
    }

    // Return the number of items in the Adapter
    @Override
    public int getCount() 
    {
        return mThumbIds.size();
    }

    // Return the data item at position
    @Override
    public Object getItem(int position) 
    {
        return mThumbIds.get(position);
    }

    // Will get called to provide the ID that
    // is passed to OnItemClickListener.onItemClick()
    @Override
    public long getItemId(int position) 
    {
        return mThumbIds.indexOf(position);
    }

    // Return an ImageView for each item referenced by the Adapter
    @Override
    public View getView(int position, View convertView, ViewGroup parent) 
    {

        ImageView imageView = (ImageView) convertView;

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

        //imageView.setImageResource(mThumbIds.get(position));
        Bitmap b = BitmapFactory.decodeFile(mThumbIds.get(position));
        imageView.setImageBitmap(b);
        return imageView;
    }
}
公共类ImageAdapter扩展了BaseAdapter
{
私有静态最终整数填充=8;
专用静态最终整数宽度=250;
专用静态最终内部高度=250;
私有上下文;
私人名单;
//存储图像ID的列表
公共ImageAdapter(上下文c,列表ID)
{
mContext=c;
this.mThumbIds=ids;
}
//返回适配器中的项目数
@凌驾
public int getCount()
{
返回mThumbIds.size();
}
//返回位置处的数据项
@凌驾
公共对象getItem(int位置)
{
返回mThumbIds.get(位置);
}
//将被调用以提供
//传递给onItemClick Listener.onItemClick()
@凌驾
公共长getItemId(int位置)
{
返回mThumbIds.indexOf(位置);
}
//为适配器引用的每个项目返回ImageView
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图)
{
ImageView ImageView=(ImageView)convertView;
//如果convertView未回收,请初始化某些属性
如果(imageView==null)
{
imageView=新的imageView(mContext);
setLayoutParams(新的GridView.LayoutParams(宽度、高度));
setPadding(PADDING,PADDING,PADDING,PADDING);
imageView.setScaleType(imageView.ScaleType.CENTER\U裁剪);
}
//setImageResource(mThumbIds.get(position));
位图b=BitmapFactory.decodeFile(mThumbIds.get(position));
设置图像位图(b);
返回图像视图;
}
}
因此,上述函数的问题是,我不能使用getItemId,因为它不返回long,而是返回一个字符串,我无法从中获得有用的内容


我尝试过的另一件事是将位图图像作为额外图像传递到我的包中,并在另一侧读取它,但我仍然无法获得要显示的实际图像。

假设
mThumbIdsSelfies
是图像路径的
ArrayList
,您可以使用以下方法:

Intent intent = new Intent(MainActivity.this, ImageViewActivity.class);
intent.putExtra(EXTRA_RES_ID, mThumbIdsSelfies[position]);
startActivity(intent);

然后在
活动中检索它(
ImageViewActivity
),并像在适配器的
getView()
方法中一样使用它。

我终于解决了这个问题,下面就是我所做的

MainActivity.java-更改了以下行

intent.putExtra(EXTRA_RES_ID, mThumbIdsSelfies.get(position)/*(int) id*/);
ImageViewActivity.java

protected static final String EXTRA_RES_ID = "POS";
private ArrayList<String> mThumbIdsSelfies = new ArrayList<String>();

if(populateArrayList())
{
    GridView gridview = (GridView) findViewById(R.id.gridview);

    // Create a new ImageAdapter and set it as the Adapter for this GridView
    gridview.setAdapter(new ImageAdapter(this, mThumbIdsSelfies));

    // Set an setOnItemClickListener on the GridView
    gridview.setOnItemClickListener(new AdapterView.OnItemClickListener()
    {
        public void onItemClick(AdapterView<?> parent, View v,
                                int position, long id)
        {

            //Create an Intent to start the ImageViewActivity
            Intent intent = new Intent(MainActivity.this, ImageViewActivity.class);

            // Add the ID of the thumbnail to display as an Intent Extra
            intent.putExtra(EXTRA_RES_ID, (int) id);

            // Start the ImageViewActivity
            startActivity(intent);
        }
    });
}

private boolean populateArrayList()
{
    File dir = getAlbumDir();
    //Bitmap myBitmap;

    if (dir.isDirectory())
    {
        File[] files = dir.listFiles();

        for (int i = 0; i < files.length; i++)
        {
            //myBitmap = BitmapFactory.decodeFile(files[i].toString());
            mThumbIdsSelfies.add(files[i].toString());
        }
    }

    return true;
}
String s = intent.getStringExtra(MainActivity.EXTRA_RES_ID);
Bitmap bitmap = BitmapFactory.decodeFile(s);
imageView.setImageBitmap(bitmap);

所以这些更改最终帮助了我,我所要做的就是将字符串引用传递到我刚才单击的缩略图的文件位置。然后在放大该图像的活动中,我必须获取该字符串引用并从中生成位图,然后将该位图设置为imageView。

使用.setImageResource()没有意义,因为您一开始没有使用来自资源的图像。getItemId()返回一个long,那么为什么您的说法不同呢?只需将intent中的图像路径传递给下一个活动,并像在getView()中那样从该路径加载图像即可。我尝试以某种形式执行此操作,但收效甚微。不过我还是想出来了。