RecyclerView 中的 Picasso 没有加载图像(可能是路径错误)

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

大家好,我在使用 Picasso 将图像加载到 Recycleview 时遇到问题。我想将图像路径保存到 db 并在 recycleview 上显示图像。当我手动使用路径时,它可以工作,但我认为它不能正确保存或检索。

selectedImage 返回为 - content://com.android.providers.media.documents/document/image%3A392

getImage 返回为 - /document/image:392

并保存到数据库中 - /document/image:392

来自适配器:

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);
        }
    });
}

和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);
        }
    }
}

您需要先通过此代码将 data.getData 从 Uri 转换为真实路径

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;
}

您的 OnActivityResult 看起来像这样:

@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);
        }
}