Search code examples
androidimageviewandroid-custom-viewcustom-adapterandroid-viewholder

CustomAdapter is not displaying ArrayList Item: ImageView


In my CheckOutMemo.class I can set any title and content as shown in picture. Check

MainActivity.class then retrieves this title and content without any problems and displays a custom row. Like in this picture:

Title = Header

Content = bodyText

MainActivity class

But the problem is: When I take a picture - I can't display it on my custom row. (That little dog in my MainActivity is there by default). I don't know what the problem is.

I can preview my captured image as an Bitmap in my CheckOutMemo.class's contentView. I can successfully save it to my External Storage. But I can't display it on my MainActivity.

MAINACTIVITY.CLASS

public class MainActivity extends AppCompatActivity implements AdapterView.OnItemLongClickListener, AdapterView.OnItemClickListener {

public ImageView view;
private String[] mPermission = {Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA};
private static final int REQUEST_CODE_PERMISSION = 5;
CustomAdapter customAdapter;
ListView listView;
Intent intent;
final Context context = this;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    customAdapter = new CustomAdapter();
    listView = (ListView) findViewById(R.id.myListView);
    listView.setAdapter(customAdapter);
    listView.setOnItemLongClickListener(this);
    listView.setOnItemClickListener(this);
    view = (ImageView) this.findViewById(R.id.imageIcon);

    if (ActivityCompat.checkSelfPermission(MainActivity.this, mPermission[0])
            != MockPackageManager.PERMISSION_GRANTED ||
            ActivityCompat.checkSelfPermission(MainActivity.this, mPermission[1])
                    != MockPackageManager.PERMISSION_GRANTED) {

        ActivityCompat.requestPermissions(MainActivity.this,
                mPermission, REQUEST_CODE_PERMISSION);
    }
}

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    Memo memo = customAdapter.getItem(position);
    intent = new Intent(getApplicationContext(), CheckOutMemo.class);
    intent.putExtra("header", memo.header);
    intent.putExtra("bodyText", memo.bodyText);
    intent.putExtra("position", position);

    // launches edit request and saving existing item.
    startActivityForResult(intent, CheckOutMemo.EDIT_REQUEST_CODE);
}

@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) {
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
    alertDialogBuilder.setTitle("Confirm Delete");
    alertDialogBuilder.setMessage("Delete memo?");
    alertDialogBuilder.setCancelable(false);
    alertDialogBuilder.setPositiveButton("Delete", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            customAdapter.delete(position);
            customAdapter.notifyDataSetChanged();
        }
    });
    alertDialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i) {
            dialogInterface.cancel();
        }
    });
    AlertDialog alertDialog = alertDialogBuilder.create();
    alertDialog.show();

    return true;
}

public void addNewNote(View view) {
    Intent intent = new Intent(getApplicationContext(), CheckOutMemo.class);
    //Adding new listItem to the ArrayList.
    startActivityForResult(intent, CheckOutMemo.ADD_REQUEST_CODE);
}


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

    if (resultCode != Activity.RESULT_OK) {
        return;
    }
    if (requestCode == CheckOutMemo.ADD_REQUEST_CODE) {
        String header = data.getStringExtra("header");
        String bodyText = data.getStringExtra("bodyText");
        if (getIntent().hasExtra("byteArray")) {
            Bitmap bitmap = BitmapFactory.decodeByteArray(
                    getIntent().getByteArrayExtra("byteArray"), 0, getIntent().getByteArrayExtra("byteArray").length);
            view.setImageBitmap(bitmap);
        }
        Memo memo = new Memo(header, bodyText, view);
        customAdapter.add(memo);
        customAdapter.notifyDataSetChanged();
    }

    if (requestCode == CheckOutMemo.EDIT_REQUEST_CODE) {

        int position = data.getIntExtra("position", 0);
        Memo memo = customAdapter.getItem(position);
        memo.header = data.getStringExtra("header");
        memo.bodyText = data.getStringExtra("bodyText");
        customAdapter.notifyDataSetChanged();
    }
  }
}

CHECKOUTMEMO.CLASS

public class CheckOutMemo extends AppCompatActivity {
public static final int ADD_REQUEST_CODE = 1;
public static final int EDIT_REQUEST_CODE = 2;
public static final int REQUEST_IMAGE_CAPTURE = 1337;
public String fileName;
public Bitmap bitmap;
private int position;
EditText editableTitle;
EditText editableContent;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_detail);
    Intent intent = getIntent();
    editableTitle = (EditText) findViewById(R.id.editHeader);
    editableContent = (EditText) findViewById(R.id.editBodyText);
    editableTitle.setText(intent.getStringExtra("header"));
    editableContent.setText(intent.getStringExtra("bodyText"));
    checkIfUserChangedOrWroteAnyText();
    //Declaring keyword and default position.
    position = intent.getIntExtra("position", 0);
}

public void capturePhoto(View view) {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    // Ensure that there's a camera activity to handle the intent
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
        // Create the File where the photo should go
        File photoFile = null;
        try {
            photoFile = createImageFile();
        } catch (IOException ex) {
            // Error occurred while creating the File

        }
        // Continue only if the File was successfully created
        if (photoFile != null) {
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
                    Uri.fromFile(photoFile));
            startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
        }
    }
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {

        try {
            loadImageFromFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
public void loadImageFromFile() throws IOException {

    ImageView view = (ImageView)this.findViewById(R.id.primeImage);
    view.setVisibility(View.VISIBLE);
    int targetW = view.getWidth();
    int targetH = view.getHeight();

    // Get the dimensions of the bitmap
    BitmapFactory.Options bmOptions = new BitmapFactory.Options();
    bmOptions.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(fileName, bmOptions);
    int photoW = bmOptions.outWidth;
    int photoH = bmOptions.outHeight;

    // Determine how much to scale down the image
    int scaleFactor = Math.min(photoW/targetW, photoH/targetH);

    // Decode the image file into a Bitmap sized to fill the View
    bmOptions.inJustDecodeBounds = false;
    bmOptions.inSampleSize = scaleFactor;
    bitmap = BitmapFactory.decodeFile(fileName, bmOptions);
    view.setImageBitmap(bitmap);

}

public void createImageFromBitmap(){
    if(bitmap!=null) {
        Intent i = new Intent(this, MainActivity.class);
        ByteArrayOutputStream bs = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 20, bs);
        i.putExtra("byteArray", bs.toByteArray());
        startActivity(i);
    } else {
        Toast.makeText(CheckOutMemo.this, "Bitmap is null", Toast.LENGTH_SHORT).show();
    }
}

public void onSaveClick(View view){
    String editableContentString = editableContent.getText().toString();
    String editableTitleString = editableTitle.getText().toString();
    if(TextUtils.isEmpty(editableContentString) && TextUtils.isEmpty(editableTitleString)) {
        finish();
        Toast.makeText(CheckOutMemo.this, "No content to save, note discarded", Toast.LENGTH_SHORT).show();
    }
    else {
        if ((TextUtils.isEmpty(editableTitleString))) {
            editableTitleString.equals(editableContentString);
            Intent intent = new Intent();
            createImageFromBitmap();
            intent.putExtra("header", editableContent.getText().toString());
            intent.putExtra("position", position);

            //Sending userInput back to MainActivity.
            setResult(Activity.RESULT_OK, intent);
            finish();

        } else {
            Intent intent = new Intent();
            createImageFromBitmap();
            intent.putExtra("header", editableTitle.getText().toString());
            intent.putExtra("bodyText", editableContent.getText().toString());
            intent.putExtra("position", position);
            //Sending userInput back to MainActivity.
            setResult(Activity.RESULT_OK, intent);
            finish();
        }
    }
}

public void cancelButtonClickedAfterEdit() {
    Button button = (Button) findViewById(R.id.bigCancelButton);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(final View v) {
            openDialogFragment(v);
        }
    });
}

public File createImageFile() throws IOException {
        // Create an image file name
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        String imageFileName = "JPEG_" + timeStamp + "_";
        String folder_main = "DNote";
        String path = Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_PICTURES).toString() + File.separator + folder_main;
        File storageDir = new File(path);
        if (!storageDir.exists()) {
            storageDir.mkdir();
        }
        File image = File.createTempFile(
                imageFileName,  /* prefix */
                ".jpg",         /* suffix */
                storageDir      /* directory */
        );

        // Save a file: path for use with ACTION_VIEW intents
        fileName =  image.getAbsolutePath();
        MediaScannerConnection.scanFile(getApplicationContext(), new String[]{image.getPath()}, null,
                new MediaScannerConnection.OnScanCompletedListener() {
                    @Override
                    public void onScanCompleted(String path, Uri uri) {
//                        Log.i(TAG, "Scanned " + path);
                    }
                });
        return image;
    }


@Override
public void onBackPressed() {
    openDialogFragment(null);
}
public void onCancelClick(View view){
    finish();

}
}

CUSTOMADAPTER.CLASS

public class CustomAdapter extends BaseAdapter {



ArrayList<Memo> memos = new ArrayList<>();

public void add(Memo memo) {
    this.memos.add(memo);
}

public void delete(int position) {
    memos.remove(position);
}

@Override
public Memo getItem(int position) {
    return memos.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public int getCount() {
    return memos.size();
}

class MyViewHolder {
    public TextView header, bodyText;
    public ImageView imageView;

    public MyViewHolder(View view) {
        header = (TextView) view.findViewById(R.id.header);
        bodyText = (TextView) view.findViewById(R.id.bodyText);
        imageView = (ImageView) view.findViewById(R.id.primeImage);

    }
}

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

    MyViewHolder viewHolder;
    if(null == convertView){
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        convertView = inflater.inflate(R.layout.custom_row, parent, false);
        viewHolder = new MyViewHolder(convertView);
        viewHolder.header.setTag(position);

        convertView.setTag(viewHolder);

    }
    else{
        viewHolder = (MyViewHolder) convertView.getTag();
    }

    Memo memo = getItem(position);
    viewHolder.header.setText(memo.header);
    viewHolder.bodyText.setText(memo.bodyText);
    CheckOutMemo checkOutMemo = new CheckOutMemo();;
    if(checkOutMemo.bitmap!=null) {
        viewHolder.imageView.setImageBitmap(checkOutMemo.bitmap);
    }

    return convertView;
}


}

MEMO.CLASS

public class Memo {

    public String header, bodyText;
    public ImageView imageView;

    public Memo(String header, String bodyText, ImageView imageView){
        this.header = header;
        this.bodyText =  bodyText;
        this.imageView = imageView;
    }
}

I've been working on this for over 2 months every day. Any help would be appreciated!!


Solution

  • Ok here is the minimal viable solution to get what you want. I just fixed it enough so an image is returned to your main activity. The rest of your issues are for you to fix. The only class I haven't touched is your Memo class. But that being said I highly recommend you update it to store a String with the path to the image instead of an ImageView.

    But if for you what you want to do here are your files edited to work:

    First custom adapter:

    I've changed the lines where you get the image from memo, to check it's image view for a bitmap drawable and transfer that bitmap to the row's image view. There was no need to instantiate that CheckoutMemo activity here.

    public class CustomAdapter extends BaseAdapter {
    
    
    
        ArrayList<Memo> memos = new ArrayList<>();
    
        public void add(Memo memo) {
            this.memos.add(memo);
        }
    
        public void delete(int position) {
            memos.remove(position);
        }
    
        @Override
        public Memo getItem(int position) {
            return memos.get(position);
        }
    
        @Override
        public long getItemId(int position) {
            return position;
        }
    
        @Override
        public int getCount() {
            return memos.size();
        }
    
        class MyViewHolder {
            public TextView header, bodyText;
            public ImageView imageView;
    
            public MyViewHolder(View view) {
                header = (TextView) view.findViewById(R.id.header);
                bodyText = (TextView) view.findViewById(R.id.bodyText);
                imageView = (ImageView) view.findViewById(R.id.primeImage);
    
            }
        }
    
        @Override
        public View getView(final int position, View convertView, ViewGroup parent){
    
            MyViewHolder viewHolder;
            if(null == convertView){
                LayoutInflater inflater = LayoutInflater.from(parent.getContext());
                convertView = inflater.inflate(R.layout.custom_row, parent, false);
                viewHolder = new MyViewHolder(convertView);
                viewHolder.header.setTag(position);
    
                convertView.setTag(viewHolder);
    
            }
            else{
                viewHolder = (MyViewHolder) convertView.getTag();
            }
    
            Memo memo = getItem(position);
            viewHolder.header.setText(memo.header);
            viewHolder.bodyText.setText(memo.bodyText);
            if (memo.imageView.getDrawable() instanceof BitmapDrawable) {
                BitmapDrawable bitmapDrawable = (BitmapDrawable) memo.imageView.getDrawable();
                viewHolder.imageView.setImageBitmap(bitmapDrawable.getBitmap());
            }
    
            return convertView;
        }
    
    
    }
    

    Next your CheckoutMemo:

    I've changed how your setResult methods work. I've also deleted the method createImageFromBitmap. It was problematic, and also caused confusion. That one was a doozy. The createImageFromBitmap method was creating another MainActivity... confused me for a bit why onActivityResult wasn't being called. It wasn't being called because you were creating another activity =/

    Anyways in your intent you create with your results, you'll notice I am also adding the file path string to the image created. So that main activity can use it to get the image!

    public class CheckOutMemo extends AppCompatActivity {
        public static final int ADD_REQUEST_CODE = 1;
        public static final int EDIT_REQUEST_CODE = 2;
        public static final int REQUEST_IMAGE_CAPTURE = 1337;
        public String fileName;
        public Bitmap bitmap;
        private int position;
        EditText editableTitle;
        EditText editableContent;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_detail);
            Intent intent = getIntent();
            editableTitle = (EditText) findViewById(R.id.editHeader);
            editableContent = (EditText) findViewById(R.id.editBodyText);
            editableTitle.setText(intent.getStringExtra("header"));
            editableContent.setText(intent.getStringExtra("bodyText"));
            //checkIfUserChangedOrWroteAnyText();
            //Declaring keyword and default position.
            position = intent.getIntExtra("position", 0);
        }
    
        public void capturePhoto(View view) {
            Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            // Ensure that there's a camera activity to handle the intent
            if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
                // Create the File where the photo should go
                File photoFile = null;
                try {
                    photoFile = createImageFile();
                } catch (IOException ex) {
                    // Error occurred while creating the File
    
                }
                // Continue only if the File was successfully created
                if (photoFile != null) {
                    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
                            Uri.fromFile(photoFile));
                    startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
                }
            }
        }
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data){
            if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
    
                try {
                    loadImageFromFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        public void loadImageFromFile() throws IOException {
    
            ImageView view = (ImageView)this.findViewById(R.id.primeImage);
            view.setVisibility(View.VISIBLE);
            int targetW = view.getWidth();
            int targetH = view.getHeight();
    
            // Get the dimensions of the bitmap
            BitmapFactory.Options bmOptions = new BitmapFactory.Options();
            bmOptions.inJustDecodeBounds = true;
            BitmapFactory.decodeFile(fileName, bmOptions);
            int photoW = bmOptions.outWidth;
            int photoH = bmOptions.outHeight;
    
            // Determine how much to scale down the image
            int scaleFactor = Math.min(photoW/targetW, photoH/targetH);
    
            // Decode the image file into a Bitmap sized to fill the View
            bmOptions.inJustDecodeBounds = false;
            bmOptions.inSampleSize = scaleFactor;
            bitmap = BitmapFactory.decodeFile(fileName, bmOptions);
            view.setImageBitmap(bitmap);
    
        }
    
        public void onSaveClick(View view){
            String editableContentString = editableContent.getText().toString();
            String editableTitleString = editableTitle.getText().toString();
            if(TextUtils.isEmpty(editableContentString) && TextUtils.isEmpty(editableTitleString)) {
                finish();
                Toast.makeText(CheckOutMemo.this, "No content to save, note discarded", Toast.LENGTH_SHORT).show();
            }
            else {
                if ((TextUtils.isEmpty(editableTitleString))) {
                    editableTitleString.equals(editableContentString);
                    Intent intent = new Intent();
                    //createImageFromBitmap();
                    intent.putExtra("header", editableContent.getText().toString());
                    intent.putExtra("position", position);
                    intent.putExtra("photo", fileName);
    
                    //Sending userInput back to MainActivity.
                    setResult(AppCompatActivity.RESULT_OK, intent);
                    finish();
    
                } else {
                    Intent intent = new Intent();
                    //createImageFromBitmap();
                    intent.putExtra("header", editableTitle.getText().toString());
                    intent.putExtra("bodyText", editableContent.getText().toString());
                    intent.putExtra("photo", fileName);
                    intent.putExtra("position", position);
                    //Sending userInput back to MainActivity.
                    setResult(AppCompatActivity.RESULT_OK, intent);
                    finish();
                }
            }
        }
    
        public void cancelButtonClickedAfterEdit() {
            Button button = (Button) findViewById(R.id.bigCancelButton);
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(final View v) {
                    //openDialogFragment(v);
                }
            });
        }
    
        public File createImageFile() throws IOException {
            // Create an image file name
            String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
            String imageFileName = "JPEG_" + timeStamp + "_";
            String folder_main = "DNote";
            String path = Environment.getExternalStoragePublicDirectory(
                    Environment.DIRECTORY_PICTURES).toString() + File.separator + folder_main;
            File storageDir = new File(path);
            if (!storageDir.exists()) {
                storageDir.mkdir();
            }
            File image = File.createTempFile(
                    imageFileName,  /* prefix */
                    ".jpg",         /* suffix */
                    storageDir      /* directory */
            );
    
            // Save a file: path for use with ACTION_VIEW intents
            fileName =  image.getAbsolutePath();
            MediaScannerConnection.scanFile(getApplicationContext(), new String[]{image.getPath()}, null,
                    new MediaScannerConnection.OnScanCompletedListener() {
                        @Override
                        public void onScanCompleted(String path, Uri uri) {
    //                        Log.i(TAG, "Scanned " + path);
                        }
                    });
            return image;
        }
    
    
        @Override
        public void onBackPressed() {
            //openDialogFragment(null);
        }
        public void onCancelClick(View view){
            finish();
    
        }
    }
    

    Finally your MainActivity:

    In on activity result if the photo path exists. Then I am adding it to the memo object's image view to later be retrieved by the adapters ImageView. This can be upgraded a bit hence my comments above to be a little less convoluted by just passing the file path ;)

    public class MainActivity extends AppCompatActivity implements AdapterView.OnItemLongClickListener,
            AdapterView.OnItemClickListener {
    
        public ImageView view;
        private String[] mPermission = {Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA};
        private static final int REQUEST_CODE_PERMISSION = 5;
        CustomAdapter customAdapter;
        ListView listView;
        Intent intent;
        final Context context = this;
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            customAdapter = new CustomAdapter();
            listView = (ListView) findViewById(R.id.myListView);
            listView.setAdapter(customAdapter);
            listView.setOnItemLongClickListener(this);
            listView.setOnItemClickListener(this);
            //view = (ImageView) this.findViewById(R.id.imageIcon);
    
            if (ActivityCompat.checkSelfPermission(MainActivity.this, mPermission[0])
                    != MockPackageManager.PERMISSION_GRANTED ||
                    ActivityCompat.checkSelfPermission(MainActivity.this, mPermission[1])
                            != MockPackageManager.PERMISSION_GRANTED) {
    
                ActivityCompat.requestPermissions(MainActivity.this,
                        mPermission, REQUEST_CODE_PERMISSION);
            }
        }
    
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Memo memo = customAdapter.getItem(position);
            intent = new Intent(getApplicationContext(), CheckOutMemo.class);
            intent.putExtra("header", memo.header);
            intent.putExtra("bodyText", memo.bodyText);
            intent.putExtra("position", position);
    
            // launches edit request and saving existing item.
            startActivityForResult(intent, CheckOutMemo.EDIT_REQUEST_CODE);
        }
    
        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) {
            AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
            alertDialogBuilder.setTitle("Confirm Delete");
            alertDialogBuilder.setMessage("Delete memo?");
            alertDialogBuilder.setCancelable(false);
            alertDialogBuilder.setPositiveButton("Delete", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    customAdapter.delete(position);
                    customAdapter.notifyDataSetChanged();
                }
            });
            alertDialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    dialogInterface.cancel();
                }
            });
            AlertDialog alertDialog = alertDialogBuilder.create();
            alertDialog.show();
    
            return true;
        }
    
        public void addNewNote(View view) {
            Intent intent = new Intent(getApplicationContext(), CheckOutMemo.class);
            //Adding new listItem to the ArrayList.
            startActivityForResult(intent, CheckOutMemo.ADD_REQUEST_CODE);
        }
    
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
    
            if (resultCode != Activity.RESULT_OK) {
                return;
            }
            if (requestCode == CheckOutMemo.ADD_REQUEST_CODE) {
                String header = data.getStringExtra("header");
                String bodyText = data.getStringExtra("bodyText");
                File photo = new File(data.getStringExtra("photo"));
                ImageView view = new ImageView(this);
    
                if (photo.exists()) {
                    Bitmap myBitmap = BitmapFactory.decodeFile(photo.getAbsolutePath());
                    view.setImageBitmap(myBitmap);
                }
    
                Memo memo = new Memo(header, bodyText, view);
                customAdapter.add(memo);
                customAdapter.notifyDataSetChanged();
            }
    
            if (requestCode == CheckOutMemo.EDIT_REQUEST_CODE) {
    
                int position = data.getIntExtra("position", 0);
                Memo memo = customAdapter.getItem(position);
                memo.header = data.getStringExtra("header");
                memo.bodyText = data.getStringExtra("bodyText");
                File photo = new File(data.getStringExtra("photo"));
    
                if (photo.exists()) {
                    Bitmap myBitmap = BitmapFactory.decodeFile(photo.getAbsolutePath());
                    memo.imageView.setImageBitmap(myBitmap);
                }
                customAdapter.notifyDataSetChanged();
            }
        }
    }
    

    All in all, running this I can now see images in the notes created!

    Keep at your project here. Two months is a good commitment. You are doing great, keep up the good work. There are more things you can improve in there! Just keep massaging it, and never give up.

    You rock =)

    I can get you the working project I've created to test this if needed.