Захват изображения с помощью GridView (ArrayAdapter)
Мой код состоит из одного вида сетки, в котором будет несколько изображений в виде отдельных видов.
Эти изображения должны быть захвачены камерой или выбраны пользователем из галереи.
Каждый вид имеет действие, позволяющее пользователю добавить изображение или полностью удалить вид из адаптера.
- В любой момент времени может быть количество просмотров "X" с загруженными в них изображениями, НО только один вид без изображения (пустой вид, в который пользователь должен загрузить изображение)
- Я добиваюсь этого, добавляя новый элемент в адаптер каждый раз, когда пользователь успешно добавляет изображение в представление / строку
Чтобы получить onActivityResult()
работать в сочетании с GridViewAdapter
Я определил частный класс этого в своей деятельности, что позволяет мне отображать диалог выбора изображения из адаптера, и onActivityResult()
быть определенным в основной деятельности.
Ниже весь мой код
public class ImageGridView extends Activity {
GridView gridView;
GridViewAdapter gridViewAdapter;
ArrayList<GridItem> list;
Uri mUri;
String imageLocation;
ImageView imageView;
public static final int IMAGE_CAPTURE =1337, IMAGE_GALLERY=12;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_image_grid_view);
gridView = (GridView) findViewById(R.id.gridview);
//This image view is used as a test to make sure a bitmap is being returned from onActivityResult
imageView=(ImageView)findViewById(R.id.image_original);
list = new ArrayList<>();
GridItem gridItem = new GridItem();
list.add(gridItem);
gridViewAdapter = new GridViewAdapter(ImageGridView.this, R.layout.row_gridview, list);
gridView.setAdapter(gridViewAdapter);
}
private class GridViewAdapter extends ArrayAdapter<GridItem> {
private Context mContext;
private int layoutResourceId;
private ArrayList<GridItem> mGridData = new ArrayList<GridItem>();
public GridViewAdapter(Context mContext, int layoutResourceId, ArrayList<GridItem> mGridData) {
super(mContext, layoutResourceId, mGridData);
this.layoutResourceId = layoutResourceId;
this.mContext = mContext;
this.mGridData = mGridData;
}
public void setGridData(ArrayList<GridItem> mGridData) {
this.mGridData = mGridData;
notifyDataSetChanged();
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View row = convertView;
final ViewHolder holder;
if (row == null) {
LayoutInflater inflater = ((Activity) mContext).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);
holder = new ViewHolder();
holder.btnAdd = (ImageView) row.findViewById(R.id.imgAdd);
holder.btnRemove = (ImageView) row.findViewById(R.id.imgRemove);
holder.imageView=(ImageView)row.findViewById(R.id.imgPrescriptionPicasso);
row.setTag(holder);
} else {
holder = (ViewHolder) row.getTag();
}
// NOT sure if this is the correct way to go about it.
// How do I add Uri of image from onActivityResult to this
if(mGridData[position].getImageLocationAsString()!=null) {
String imageLocation = mGridData[position].getImageLocationAsString();
holder.imageView.setImageBitmap(BitmapFactory.decodeFile(imageLocation);
holder.btnAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
selectImage();
}
});
holder.btnRemove.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mGridData.remove(position);
notifyDataSetChanged();
//Remove this view entirely and notify adapter of the change
}
});
return row;
}
class ViewHolder {
ImageView imageView;
ImageView btnAdd, btnRemove;
//The buttons have been defined as image Views for now.
}
}
private void selectImage() {
final CharSequence[] items = {"Take Photo", "Choose from Gallery",
"Cancel"};
AlertDialog.Builder builder = new AlertDialog.Builder(ImageGridView.this);
builder.setTitle("Add picture of Prescription");
builder.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int item) {
if (items[item].equals("Take Photo")) {
File f = getOutputMediaFile();
mUri = Uri.fromFile(f);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, mUri);
startActivityForResult(intent, IMAGE_CAPTURE);
Log.d("Clicked", "Take photo");
} else if (items[item].equals("Choose from Gallery")) {
Intent intent = new Intent(
Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setType("image/*");
startActivityForResult(
Intent.createChooser(intent, "Select File"),
IMAGE_GALLERY);
}
}
});
builder.show();
}
private File getOutputMediaFile() {
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DCIM), "Medit");
if (!mediaStorageDir.exists()) {
mediaStorageDir.mkdirs();
}
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
File mediaFile;
mediaFile = new File(mediaStorageDir.getPath() + File.separator +
"IMG" + timeStamp + ".jpg");
Log.d("reached a", mediaFile.toString());
return mediaFile;
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data);
if (resultCode== Activity.RESULT_OK){
switch(requestCode) {
case IMAGE_CAPTURE:
Bitmap bitmap= BitmapFactory.decodeFile(mUri.getPath());
imageView.setImageBitmap(bitmap);
//If user loads an image, a new view is created with a blank image
GridItem gridItem = new GridItem();
list.add(gridItem);
gridViewAdapter.notifyDataSetChanged();
break;
case IMAGE_GALLERY:
Uri selectedImageUri = data.getData();
String[] filePathColumn = { MediaStore.Images.Media.DATA };
Cursor cursor = getContentResolver().query(selectedImageUri,
filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
imageLocation = cursor.getString(columnIndex);
cursor.close();
Bitmap bitmap1= BitmapFactory.decodeFile(imageLocation);
imageView.setImageBitmap(bitmap1);
//If user loads an image, a new view is created with a blank image
GridItem gridItem1 = new GridItem();
list.add(gridItem1);
gridViewAdapter.notifyDataSetChanged();
break;
}//Close switch statement
}else {
Log.d("Error ", "user canceled !");
}
}
}
imageView
определены в моем Activity
устанавливается в onActivityResult()
просто для того, чтобы проверить, возвращается ли это растровое изображение или нет.
Мне нужна помощь с
- В создании
view holder
установите растровое изображение для представления изображения внутри, если пользователь установил его - Я думал о том или ином как-то установить изображение определенного элемента сетки в
onActivityResult()
сам код
В GridItem в настоящее время есть строка, которую я пытаюсь использовать для хранения местоположения изображения, если оно существует, и загрузки растрового изображения в getView()
функция держателя GridViewAdapter
но я застрял здесь.
Конечная цель этого состоит в том, чтобы позволить пользователям добавлять как можно больше изображений к GridViewAdapter
и, наконец, отправить Uri.getPath()
(imageLocation as String) через намерение к следующей активности, для которой я буду использовать массив.
Буду очень признателен за любую помощь / руководство, которое я могу получить для того же. Спасибо