Search code examples
javaandroidandroid-recyclerviewpicasso

Picasso in RecycleView not loading the image (May be a path error)


Hi guys I have a problem when loading images to Recycleview using Picasso. I want to save image path to db and show image on recycleview. When i use path manually it works but i think it doesn't save or retrive correctly.

selectedImage retuns as - content://com.android.providers.media.documents/document/image%3A392

getImage retuns as - /document/image:392

and saves to db as - /document/image:392

From adapter:

public void onBindViewHolder(MyHolder holder, int position) {

    holder.notestxt.setText(notes.get(position).getNote());
    if (notes.get(position).getImage().trim().length() != 0) {
        holder.img1.setVisibility(VISIBLE);
        Picasso.get().load(notes.get(position).getImage()).into(holder.img1);
    } else {
        holder.img1.setVisibility(GONE);
    }

    holder.setItemClickListener(new ItemClickListener() {

        @Override
        public void onItemClick(View v, int pos) {
            //OPEN DETAIL ACTIVITY
            //PASS DATA

            //CREATE INTENT
            Intent i = new Intent(c, editnote.class);

            //LOAD DATA
            i.putExtra("NOTE", notes.get(pos).getNote());

            //START ACTIVITY
            c.startActivity(i);
        }
    });
}

And part of Activity:

public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {
        case android.R.id.home:
            onBackPressed();
            break;
        case R.id.action_image:
            ActivityCompat.requestPermissions(addnote.this,
                    new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    1);
            getimages();
            break;
        case R.id.action_save:
            if (editable_item.getText().toString().trim().length() != 0) {
                save(editable_item.getText().toString(), "");
                Intent i = new Intent(getApplicationContext(), MainActivity.class);
                startActivity(i);
                Toast.makeText(getApplicationContext(), "Note saved", Toast.LENGTH_SHORT).show();
            } else {
                String path = selectedImage.getPath();
                save("", path);
                Intent i = new Intent(getApplicationContext(), MainActivity.class);
                startActivity(i);
                Toast.makeText(getApplicationContext(), "Image saved", Toast.LENGTH_SHORT).show();
            }
            break;

        case R.id.action_cancel:
            Intent x = new Intent(getApplicationContext(), MainActivity.class);
            startActivity(x);
            finish();
    }
    return true;
}

private void save(String note, String image) {
    DBAdapter db = new DBAdapter(this);

    //OPEN
    db.openDB();

    //INSERT
    long result = db.add(note, image);

    editable_item.setText("");

    //CLOSE
    db.close();

}

private void getimages() {
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(Intent.createChooser(intent, "Select Contact Image"), 1);

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

        if (requestCode == 1 && resultCode == RESULT_OK && null != data) {

            selectedImage = data.getData();

            editable_item.setVisibility(View.GONE);
            imageView.setVisibility(View.VISIBLE);
            Picasso.get().load(selectedImage).into(imageView);
        }
    }
}

Solution

  • You need to convert data.getData from Uri to real path first by this code

    private String getRealPathFromContentUri(Context context, Uri contentURI) {
        String result = null;
        Cursor cursor = context.getContentResolver().query(contentURI, null, null, null, null);
        if (cursor == null) {
          try {
            result = contentURI.getPath();
          } catch (Exception e) {
            e.printStackTrace();
          }
        } else {
          cursor.moveToFirst();
          int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
          try {
            result = cursor.getString(idx);
            cursor.close();
          } catch (IllegalStateException e) {
            e.printStackTrace();
            return null;
          }
        }
        return result;
    }
    

    Your OnActivityResult would look like this:

    @Override
        protected void onActivityResult ( int requestCode, int resultCode, Intent data){
            super.onActivityResult(requestCode, resultCode, data);
    
            if (requestCode == 1 && resultCode == RESULT_OK && null != data) {
    
                selectedImage = getRealPathFromContentUri(context,data.getData());
    
                editable_item.setVisibility(View.GONE);
                imageView.setVisibility(View.VISIBLE);
                Picasso.get().load(selectedImage).into(imageView);
            }
    }