提问者:小点点

除非先保存文件,否则不会调用OnBindViewHolder


更新#2

感谢AgentP暗示我的问题。 通过在showImages()中进行更改,我已修复了此问题:

(还创建了全局引用字段字符串路径;在相同的activity中):

    private void showImages(){
    
        // Added following two lines :
        ContextWrapper cw = new ContextWrapper(this); // + added
        path = cw.getDir("files", Context.MODE_PRIVATE).toString(); // + added
    
        //  String path = DrawingActivity.path; // - removed
        allFilesPaths = new ArrayList<>();
        allFilesPaths = listAllFiles(path);
    
        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.galleryRecycleViewId);
        recyclerView.setHasFixedSize(true);
    
        RecyclerView.LayoutManager layoutManager = new GridLayoutManager(getApplicationContext(), 3);
        recyclerView.setLayoutManager(layoutManager);
    
        ArrayList<Cell> cells = prepareData();
        ImageAdapter adapter = new ImageAdapter(getApplicationContext(), cells);
        recyclerView.setAdapter(adapter);
    
    }

更新

显然,我有一个静态字符串,只设置在保存图像方法。 它的目的是为show images方法提供图像文件夹路径。 我现在正试图通过其他方法为showImages()方法提供路径。

旧的

我有一个画廊activity,显示图像从一个文件夹与回收器视图。

当我启动我的应用程序时,图片库是空的,尽管文件夹中有图片。

当我去我的绘图activity,保存一个图像,并返回画廊activity它显示所有的图像没有问题。

我在onbindviewholder方法中放置了一个日志,它只在我保存图像后执行。

图像适配器缺少什么功能来查看退出的文件,图像保存做什么来使它在执行时找到它们?

(我还记得当我编写save image方法时,它希望我做@SuppressLint(“错误线程”),但现在它没有它也能工作)

在绘图activity中未保存文件而打开库时调试信息:

  • 类加载器引用了未知路径:/data/app/com.example.myapp-2/lib/x86_64
  • 在Android 4.1之前,方法Android.graphics.PorterDuffColorFilter AndroidX.VectorDrawable.graphics.Drawable.VectorDrawableCompat.UpdatetIntFilter(Android.graphics.PorterDuffColorFilter,Android.content.res.ColorStateList,Android.graphics.PorterDuff$mode)将错误地重写Android.graphics.Drawable.Drawable中的package-private方法
  • 拒绝对以前失败的类java.lang.class
  • 的重新初始化
  • D/OpenGLRenderer:使用EGL_SWAP_BEHIVAIOR_PRESTEATE:TRUE
  • I/OpenGLRenderer:初始化的EGL,版本1.4
  • w/OpenGlRenderer:无法使用EGL_SWAP_BHEAVIOR_PRESTEATED选择配置,重试时不使用...

在画廊activity内显示图像所涉及的方法:

    List <Cell> allFilesPaths;
        
        // on create calls show images after checking if read storage permission is good
        
     private void showImages(){
            // this is the current problem line , 
            // I need a way to give path of my image folder to this method
            // Check SaveImage() method below to see how it is initially set
            // path is a global static field inside drawing activity
            String path = DrawingActivity.path;
            allFilesPaths = new ArrayList<>();
            allFilesPaths = listAllFiles(path);
    
            RecyclerView recyclerView = (RecyclerView) findViewById(R.id.galleryRecycleViewId);
            recyclerView.setHasFixedSize(true);
    
            RecyclerView.LayoutManager layoutManager = new GridLayoutManager(getApplicationContext(), 3);
            recyclerView.setLayoutManager(layoutManager);
    
            ArrayList<Cell> cells = prepareData();
            ImageAdapter adapter = new ImageAdapter(getApplicationContext(), cells);
            recyclerView.setAdapter(adapter);
    
        }
    
        private ArrayList<Cell> prepareData(){
            ArrayList<Cell> allImages = new ArrayList<>();
            for (Cell c : allFilesPaths){
                Cell cell = new Cell();
                cell.setTitle(c.getTitle());
                cell.setPath(c.getPath());
                allImages.add(cell);
            }
            return allImages;
        }
    
        private List<Cell> listAllFiles(String pathName){
            List<Cell> allFiles = new ArrayList<>();
            if(pathName != null){
                File file = new File(pathName);
                File[] files = file.listFiles();
                if(files != null){
                    for (File f : files){
                        Cell cell = new Cell();
                        cell.setTitle(f.getName());
                        cell.setPath(f.getAbsolutePath());
                        allFiles.add(cell);
                    }
                }
            }
            return allFiles;
        }

在我的映像适配器中:

private ArrayList<Cell> galleryList;
private Context context;
private static final String TAG = "ImageAdapter";

public ImageAdapter(Context context, ArrayList<Cell> galleryList) {
    this.context = context;
    this.galleryList = galleryList;
}

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

@Override
public void onBindViewHolder(@NonNull ImageAdapter.ViewHolder holder, final int position) {
    holder.img.setScaleType(ImageView.ScaleType.CENTER_CROP);
    Log.d(TAG, "onBindViewHolder: " + galleryList.size());
    setImageFromPath(galleryList.get(position).getPath(), holder.img);
    holder.img.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String path = galleryList.get(position).getPath();
            Intent intent = new Intent(context ,ImagePreview.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.putExtra("imagePath",path);
            context.startActivity(intent);
        }
    });

}

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


public class ViewHolder extends RecyclerView.ViewHolder {
    private ImageView img;

    public ViewHolder(@NonNull View itemView) {
        super(itemView);
        img = (ImageView) itemView.findViewById(R.id.img);
    }
}

private void setImageFromPath(String path, ImageView image){
    File imgFile = new File(path);

    try {
            Bitmap myBitmap = BitmapFactory.decodeStream(new FileInputStream(imgFile));
            image.setImageBitmap(myBitmap);
            //            ImageView imageView = (ImageView)findViewById(R.id.imageViewSelect);
            //            imageView.setImageBitmap(bitmap);
    }catch (FileNotFoundException e){
        e.printStackTrace();
    }
}

在绘制activity内保存图像的方法:

   public void saveImage() {
       ContextWrapper cw = new ContextWrapper(getContext());
       String filename = "img" + System.currentTimeMillis();
       File directory = cw.getDir("files", Context.MODE_PRIVATE);
       path = cw.getDir("files", Context.MODE_PRIVATE).toString();
       File myPath = new File(directory, filename + ".jpg");

       FileOutputStream fileOutputStream = null;
       try {
           fileOutputStream = new FileOutputStream(myPath);
           bitmap.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);
       }catch(Exception e){
           e.printStackTrace();
       }finally {
           try {
               fileOutputStream.flush();
               fileOutputStream.close();
           }catch (IOException e){
               e.printStackTrace();
           }
       }
   }

共2个答案

匿名用户

确保showImages()中的变量DrawingActivity.Path包含一些值。 它可能没有正确初始化。

匿名用户

尝试将其放入ViewHolder类构造函数中

setImageFromPath(galleryList.get(getLayoutPosition()).getPath(), holder.img);