在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中并让它们保持在那里而不会相互覆盖?
答案 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;
}
为了获得更好的解决方案......有很多方法可以做到这一点。这就是我要做的事情:
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。