Захват изображения с помощью GridView (ArrayAdapter)

Мой код состоит из одного вида сетки, в котором будет несколько изображений в виде отдельных видов.

  1. Эти изображения должны быть захвачены камерой или выбраны пользователем из галереи.

  2. Каждый вид имеет действие, позволяющее пользователю добавить изображение или полностью удалить вид из адаптера.

  3. В любой момент времени может быть количество просмотров "X" с загруженными в них изображениями, НО только один вид без изображения (пустой вид, в который пользователь должен загрузить изображение)
  4. Я добиваюсь этого, добавляя новый элемент в адаптер каждый раз, когда пользователь успешно добавляет изображение в представление / строку

Чтобы получить 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() просто для того, чтобы проверить, возвращается ли это растровое изображение или нет.

Мне нужна помощь с

  1. В создании view holderустановите растровое изображение для представления изображения внутри, если пользователь установил его
  2. Я думал о том или ином как-то установить изображение определенного элемента сетки в onActivityResult() сам код

В GridItem в настоящее время есть строка, которую я пытаюсь использовать для хранения местоположения изображения, если оно существует, и загрузки растрового изображения в getView() функция держателя GridViewAdapter но я застрял здесь.

Конечная цель этого состоит в том, чтобы позволить пользователям добавлять как можно больше изображений к GridViewAdapter и, наконец, отправить Uri.getPath() (imageLocation as String) через намерение к следующей активности, для которой я буду использовать массив.

Буду очень признателен за любую помощь / руководство, которое я могу получить для того же. Спасибо

0 ответов

Другие вопросы по тегам