在Recyclerview中显示内部存储中的图像

4
我正在将相机和图库(多选)中的图像保存到内部存储的文件夹中,并希望在水平RecyclerView中显示这些图像。 在行布局中,除了ImageView之外,还有一个关闭按钮。当单击该关闭按钮时,我希望从内部存储中删除图像(文件)。 我有2个问题: 问题1: 当我从图库中选择图像(单个或多个),图像会正确保存,但在Recyclerview中,来自图库的图像将在所有位置显示,即如果文件夹中有2个图像并且我从图库中选择1个图像,则在Recyclerview中所有3个位置都只有来自图库的图像。 问题2: 如何在单击关闭按钮时从文件夹中删除图像?

//Recyclerview Adapter
public class RecycleImageAdapter extends RecyclerView.Adapter<RecycleImageAdapter.ViewHolder> {

    private List<String> itemList;
    private Context mContext;

    public RecycleImageAdapter(Context context, List<String> itemList) {
        this.itemList = itemList;
        this.mContext = context;
    }

    @Override
    public RecycleImageAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.imagelayout, parent, false);
        return new RecycleImageAdapter.ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final RecycleImageAdapter.ViewHolder holder, int position) {
        for (int i= 0; i < itemList.size(); i++) {
            Uri uri = Uri.parse(itemList.get(i));
            holder.setImageView(uri);


        }

    }

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

    class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

        ImageView image, delbtn;

        ViewHolder(View itemView) {
            super(itemView);
            image = (ImageView) itemView.findViewById(R.id.img_thumbnail);
            delbtn = (ImageView)itemView.findViewById(R.id.del);
            delbtn.setOnClickListener(this);
        }

        public void setImageView(Uri uri){
            Picasso.with(mContext).load(uri).into(new Target() {
                @Override
                public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
                    image.setImageBitmap(bitmap);
                }

                @Override
                public void onBitmapFailed(Drawable errorDrawable) {
                    Log.e("sammy_error"," "+errorDrawable);
                }

                @Override
                public void onPrepareLoad(Drawable placeHolderDrawable) {

                }
            });
        }

        @Override
        public void onClick(View view) {
            int position = getAdapterPosition();
            Toast.makeText(mContext, itemList.get(position), Toast.LENGTH_SHORT).show();
            itemList.remove(position);
            notifyItemRemoved(position);
            notifyItemRangeChanged(position, itemList.size());

   //Here I'm getting ArrayIndexOutOfBoundsException
            File file = new File(itemList.get(position));
            file.delete();
        }
    }
}
//in Fragment, code to load images

File directory = new File(file_path);
        File newfile[] = directory.listFiles();
        //finalImages is ArrayList<String>  
        if(finalImages!=null )finalImages.clear();

        for (int i= 0; i < newfile.length; i++) {
            String path = "file://"+newfile[i].getAbsolutePath();
            finalImages.add(path);
        }

        recyladapter.notifyDataSetChanged();


非常抱歉,我无法理解您的问题。您能否详细说明,以便我能更好地帮助您? - Varun Kumar
我想在Recyclerview中显示来自内部存储器中特定文件夹(例如“Arc”)的图像。我将从相册和相机保存图像到Arc文件夹中。在将图像保存到Arc文件夹后(无论是从相册还是相机),我在片段中使用上述代码来显示图像。 - Somnath Pal
所以流程如下:相机意图 -> 拍摄的图片 -> 保存在Arc中 -> Fragment代码在recyclerview中显示图像。或者从相册中选择图像 -> 保存在Arc中 -> Fragment代码在recyclerview中显示图像。 - Somnath Pal
@SomnathPal,您能在从图库选择时发布图像保存部分吗? - Raghavendra
1
@SomnathPal 在onBindViewHolder中,为什么要使用for循环?您能否删除它并使用position参数尝试一下? - Raghavendra
显示剩余14条评论
1个回答

0

我不太明白你的第一部分,请再解释一下。

在第二部分中,很简单,只需将图像路径设置为imageView标签即可。

imageView.setTag(imageAbsolutePath);

当您单击图像时,从图像视图中获取标签并将其转换为文件,如下所示。
File path = new File(imageView.getTag().toString());
path.delete();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接