首页 > 解决方案 > 如何在 RecyclerView 中使用 uri 获取图像?

问题描述

我正在 Android 工作室开发一个应用程序。单击片段中的按钮以打开一个对话框并包含图片和简要说明。(图片取自您的图库。)单击 OK 关闭对话框并在 Fragment 中存在的 RecyclerView 中包含图像和描述。但是我编织的这段代码有描述,但它没有图像。我想听听这个问题的解决方案,所以我问了你一个问题。

非常感谢您的回复!

为了简要解释我的代码是如何工作的,当我从对话框接收到图像时,我将文件的路径 (/storage/emulated/0/Pictures/a.jpg) 作为 toast 消息发送,并在对话框中立即发送关闭后,将imagepath和description转成String形式,将imagepath从Fragment转换为uri,改成Bitmap,应用到RecyclerView。

下面是我的代码。

片段.java

        btn_addlist = view.findViewById(R.id.btn_addlist);
        btn_addlist.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DialogFragment_cus dialog = new DialogFragment_cus();
                dialog.show(getActivity().getSupportFragmentManager(), "tag");
                dialog.setDialogResult(new DialogFragment_cus.OnMyDialogResult() {
//                    result : uri, result2 : dlg_edtName, result3 : dlg_edtSubtitle
                    @Override
                    public void finish(String result, String result2, String result3) {
                        imageUri = result;  RecyclerInputName = result2;
                        RecyclerInputSubtitle = result3;
                        Uri uri = Uri.parse("file://" + imageUri);
                        Bitmap bitmap = null;
                        try {
                            bitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), uri);
                        } catch (FileNotFoundException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        RecyclerItem_cus item = new RecyclerItem_cus(bitmap, RecyclerInputName, RecyclerInputSubtitle);
                        mArrayList.add(0, item);
                        mAdapter.notifyDataSetChanged();
                        Toast.makeText(getActivity(), "finish.", Toast.LENGTH_SHORT).show();
                    }
                });
            }
        });

DialogFragment.java

        dlg_AddButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_PICK);
                startActivityForResult(intent, 1);
            }
        });
        dlg_ok.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DialogFragment_cus fragment = new DialogFragment_cus();
                String input1 = dlg_edtName.getText().toString();
                String input2 = dlg_edtSubtitle.getText().toString();
                if(fragment != null) {
                    if(mDialogResult != null ) {
                        mDialogResult.finish(name_Str, input1, input2);
                    }
                }
                dismiss();
            }
        });
        dlg_cancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dismiss();
            }
        });
        return view;
    }
    public void setDialogResult(OnMyDialogResult dialogResult){
        mDialogResult = dialogResult;
    }

    public interface OnMyDialogResult{
        void finish(String result, String result2, String result3);
    }
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == 1 && resultCode == RESULT_OK) {
            try {
                name_Str = getImageNameToUri(data.getData());
                InputStream in = getActivity().getContentResolver().openInputStream(data.getData());
                Bitmap img = BitmapFactory.decodeStream(in);
                in.close();
                dlg_ImageView.setImageBitmap(img);
                dlg_ImageView.setBackgroundResource(android.R.color.white);
                Toast.makeText(getActivity(), "name_Str : "+name_Str , Toast.LENGTH_LONG).show();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    public String getImageNameToUri(Uri uri) {
        String[] projection = {MediaStore.Images.Media.DATA};
        Cursor cursor = getActivity().getContentResolver().query(uri, projection, null, null, null);
        getActivity().startManagingCursor(cursor);
        int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(columnIndex);
    }

RecyclerView_cusAdapter.java

@Override
    public void onBindViewHolder(@NonNull final MyViewHolder myViewHolder, int i) {
        final RecyclerItem_cus item = items.get(i);
        if (item != null) {
            Glide.with(context)
                    .load(item.getImage())
                    .asBitmap()
                    .format(DecodeFormat.PREFER_ARGB_8888)
                    .into(new SimpleTarget<Bitmap>() {
                        @Override
                        public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
                            myViewHolder.cus_img.setImageBitmap(resource);
                        }
                    });
            myViewHolder.cus_title.setText(item.getTitle());
            myViewHolder.cus_subtitle.setText(item.getSubTitle());
        }
    }

    @Override
    public int getItemCount() {
        return this.items.size();
    }

    public class MyViewHolder extends RecyclerView.ViewHolder {
        TextView cus_title;
        TextView cus_subtitle;
        ImageView cus_img;

        public MyViewHolder(View itemView) {
            super(itemView);

            cus_title = itemView.findViewById(R.id.cus_title);
            cus_subtitle = itemView.findViewById(R.id.cus_subtitle);
            cus_img = itemView.findViewById(R.id.cus_img);
        }
    }

RecyclerItem_cus.java

public class RecyclerItem_cus {
    private Bitmap image;
    private String title;
    private String subTitle;

    public RecyclerItem_cus(Bitmap image, String title, String subTitle) {
        this.image = image;
        this.title = title;
        this.subTitle = subTitle;
    }

    public Bitmap getImage() {
        return image;
    }
    public String getTitle() {
        return title;
    }
    public String getSubTitle() {
        return subTitle;
    }

标签: android

解决方案


您可以尝试直接将 Glide 与 File 对象一起使用:

Glide.with(mContext)
  .load(new File(item.getImage())) // Uri of the picture
  .into(myViewHolder.cus_img);

推荐阅读