将Uris数组添加到GridView中

时间:2015-11-21 13:03:44

标签: android gridview arraylist imageview adapter

在gridView中设置Uris的ArrayList时,只显示一个项目。为什么?

适配器:

public class ImageGridAdapter extends BaseAdapter {

private Context mContext;

public ImageGridAdapter(Context c) {

    this.mContext = c;
}

@Override
public int getCount() {
    try {
        return PictureGroupActivity.ALofSelectedImgs.size();
    } catch (NullPointerException e) {
        return 0;
    }
}

@Override
public Object getItem(int position) {

    return PictureGroupActivity.ALofSelectedImgs.get(position);
}

@Override
public long getItemId(int position) {

    return position;
}


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


    ImageView imageView;
    if (convertView == null) {
        imageView = new ImageView(mContext);
        imageView.setLayoutParams(new GridView.LayoutParams(200, 200));
        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
        imageView.setPadding(5, 5, 5, 5);
    }  else {
        imageView = (ImageView) convertView;
    }

    try {
        imageView.setImageURI(PictureGroupActivity.ALofSelectedImgs.get(position));
        Toast.makeText(mContext.getApplicationContext(), "Idee: " + PictureGroupActivity.ALofSelectedImgs, Toast.LENGTH_SHORT).show();
    }catch (NullPointerException e) {}

    return imageView;
}

设置适配器:

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

    GridView gridView = (GridView) findViewById(R.id.picture_group_gridView);
    gridView.setAdapter(new ImageGridAdapter(this));
    gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Toast.makeText(PictureGroupActivity.this, "You clicked " + position, Toast.LENGTH_SHORT).show();
        }
    });
}

从我拍摄图像的位置(从手机图库中选择后):

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) {
        selectedImage = data.getData();

            ALofSelectedImgs = new ArrayList<Uri>();
            ALofSelectedImgs.add(selectedImage);


        Intent restart = getIntent();
        finish();
        startActivity(restart);

    }
}

如何将多个图像添加到ArrayList中并让它们保持在那里而不会相互覆盖?

1 个答案:

答案 0 :(得分:1)

我可以在这里看到一些问题。

最简单的解决方案(更改最少的代码)。将ALofSelectedImgs = new ArrayList();移至onActivityResult(int, int, Intent)并将其放入onCreate(Bundle)

这仍然不会在方向更改或关闭应用之间保留数据。每次调用onCreate(Bundle)时,您都会得到一个新的空ArrayList。

我不建议使用这样的静态字段。对于初学者,您不能将ImageGridAdapter与任何其他活动或片段一起使用。您需要在构造函数或setter方法中将List传递给它。这样你就可以更容易地重复使用它。

private Context mContext;
private List<Uri> mUris;

public ImageGridAdapter(Context context, List<Uri> uris) {
    super(context);
    mContext = context;
    mUris = uris;
}

为了获得更好的解决方案......有很多方法可以做到这一点。这就是我要做的事情:

  • 创建一个扩展SQLiteOpenHelper的类,以便将选定的Uris保存在SQLite表中。我从这个 tutorial中学到了很多东西。对于这么简单的事情,我可能不会担心ContentProvider。如果你有兴趣,我可以给你一个模板,用于在合同类中保留很多表的列和其他常量。
  • 创建一个扩展SimpleCursorAdapter的适配器,以从包含SQLite表中的查询的Cursor创建视图。这在上面的教程中有解释。
  • 在PhotoGroupActivity中,执行对表的查询,并使用onCreate(Bundle)中返回的Cursor初始化适配器。
  • onActivityResult(int, int, Intent)中,您需要将Uri插入SQLite表,然后执行另一个查询并为适配器提供新的Cursor。

编辑: 回答你的第二个问题。一开始我没有想到这一点,但你想要使用缩略图在GridView中显示。使用Bitmap.createScaledBitmap(Bitmap, int, int, boolean)创建缩略图。将缩略图存储在应用程序的私有存储中,以避免它进入您的图库,然后将Uri添加到缩放到ArrayList。您可能希望跟踪全尺寸图像的Uri以及用户触摸缩略图的时间。

尝试使用HashMap,缩略图Uri作为键,使用全尺寸Uri作为值。

// Create the HashMap like this:
HashMap<Uri, Uri> uriMap = new HashMap<>();

// You have the main Uri. Get the bitmap, create a thumbnail and store it.
// Add an entry to the HashMap like this:
uriMap.put(thumbnailUri, fullSizeUri);

// To get the list of thumbnail Uris for the adapter:
List<Uri> thumbnailList = new ArrayList<>(uriMap.keySet());

// When user presses an image in GridView, get the relevant full-size
// Uri like this:
fullSizeUri = uriMap.get(thumbnailUri);

再次编辑: 我再次看了一眼,意识到我建议了一个CursorAdapter,然后提供了如何获取数据的HashMap的信息。

相反,只需在SQLite表中添加另一列并将Uris存储在那里。获取Uri和缩略图Uri时,将它们存储在表中并查询表中的SimpleCursorAdapter。