代码之家  ›  专栏  ›  技术社区  ›  Chuflitas

单击片段上RecyclerView的适配器项目(照片)时显示ImageView

  •  0
  • Chuflitas  · 技术社区  · 7 年前

    我有一个问题,我读到它,我不能在OnBindViewHolder上这样做,但我在其他网站上使用它,并且总是出现相同的错误。。。 在我出错后,我也使用长时间单击来做一件事,它工作正常,但在此之前,我想使用时钟正常,而不是长时间,因为当我单击时,会显示带有图像的alertbox(我也尝试使用imageview normal来做这件事,而不使用alertbox) 但没什么,同样的错误。。。

    我想用这个来拍摄一张recyclerview的照片,然后从目录中打开它并在alertbox中“缩放”。。。

    代码

    public class Fotos extends RecyclerView.Adapter<Fotos.ViewHolder> {
    
        private Context context;
        private List<ImageItem> fotosLista;
        private ImageButton image;
    
    
        public Fotos(List<ImageItem> fotosLista, Context context) {
            this.fotosLista = fotosLista;
            this.context = context;
    
    
        }
    
    
        public Fotos() {
    
        }
    
    
        public static class ViewHolder extends RecyclerView.ViewHolder {
    
            public View view;
           public ImageButton image;
    
    
    
    
            public ViewHolder(View itemView) {
                super(itemView);
                view = itemView;
                image = itemView.findViewById(R.id.imagen);
    
    
            }
    
        }
    
    
        @Override
        public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
            View itemView = LayoutInflater.from(viewGroup.getContext())
                    .inflate(R.layout.grid_item, viewGroup, false);
    
            ViewHolder tvh = new ViewHolder(itemView);
    
    
            return tvh;
    
        }
    
    
        @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
        @Override
        public void onBindViewHolder(final ViewHolder viewHolder, int pos) {
    
            final ImageItem item = fotosLista.get(pos);
            image = viewHolder.view.findViewById(R.id.imagen);
            image.setImageBitmap(item.getImage());
            image.setImageBitmap(Bitmap.createScaledBitmap(item.getImage(), 120, 120, false));
    
    
            viewHolder.image.setOnClickListener(new View.OnClickListener() {
                @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
                @Override
                public void onClick(View v) {
                    File[] listFile;
                    File file = new File("storage/emulated/0/Pictures/myDirectoryName/");
                    listFile = file.listFiles();
                    for (int i = 0; i < listFile.length; i++) {
                        String path = listFile[i].getAbsolutePath();
                        Bitmap bitmapMostrar = BitmapFactory.decodeFile(path);
    
    
                        ImageView mostrarImagen=(ImageView)viewHolder.view.findViewById(R.id.mostrarImagen2);
                        mostrarImagen.setImageBitmap(bitmapMostrar);
    
    
                    }
                        AlertDialog.Builder transferencia2 = new AlertDialog.Builder(viewHolder.view.getContext());
                        transferencia2.setView(R.layout.imagenzoom);
                        AlertDialog dialog2 = transferencia2.create();
                        dialog2.show();
    
    
    
    
                }
            });
    
    
            viewHolder.image.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
    
    
                    AlertDialog.Builder transferencia = new AlertDialog.Builder(viewHolder.view.getContext());
                    transferencia.setMessage("¿Deseas enviar la foto al servidor?");
                    transferencia.setTitle("Transferir/Cancelar ");
                    transferencia.setPositiveButton("Transferir", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
    
                            dialogInterface.cancel();
    
    
                            //Aquí va lo de la BD + Update
    
    
    
    
                        }
    
    
                    });
                    transferencia.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
    
                            //Aquí se cierra el alertBox y se cancela la transferencia.
    
                            dialogInterface.cancel();
    
    
                        }
                    });
    
                    AlertDialog dialog2 = transferencia.create();
                    dialog2.show();
    
    
                    return true;
                }
            });
    
    
        }
    
    
        @Override
        public int getItemCount() {
            return (null != fotosLista ? fotosLista.size() : 0);
        }
    

    问题出在OnBindViewHolder上,在第一个onClick方法上。。。 *LogCat错误:*

    05-08 17:26:47.870 14576-14576/com.example.practicas_.arcadiatruck E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.practicas_.arcadiatruck, PID: 14576
    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setImageBitmap(android.graphics.Bitmap)' on a null object reference
        at com.example.practicas_.arcadiatruck.Fotos$1.onClick(Fotos.java:105)
        at android.view.View.performClick(View.java:5637)
        at android.view.View$PerformClick.run(View.java:22433)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6119)
        at java.lang.reflect.Method.invoke(Native Method)
        at 
    
    com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
    05-08 17:26:47.873 1135-4779/? W/ActivityManager:Force finishing activity com.example.practicas_.arcadiatruck/.ActividadFragments
    

    alertbox是一个只有一个图像的布局,我用android测试了它:src和可绘制图像,我点击它,它就工作了。。。 谢谢你们,我用这个xD浪费了很多时间

    1 回复  |  直到 7 年前
        1
  •  0
  •   Suleyman    7 年前

    删除此行

    image = viewHolder.view.findViewById(R.id.imagen);
    

    当你使用 setImageBitmap 访问 image 就像那样

    viewHolder.image.setImageBitmap(yourImage);
    

    编辑:

    你的生活中发生了很多事情 onBindViewHolder 你夸大了你的观点( findViewById )在不同的地方。所有这些工作都应该转移到 ViewHolder 这将更容易管理。

    首先,这条线你有两次 image = viewHolder.view.findViewById(R.id.imagen); ,你不需要那样做,你只需要做一次,以后再做一次 视图持有者 构造函数,仅此而已。

    还有这条线 ImageView mostrarImagen=(ImageView)viewHolder.view.findViewById(R.id.mostrarImagen2); 在你的 视图持有者 构造函数且不在 onBindViewHolder

    之后,移除 View view 从您的 视图持有者 并从构造函数中删除这一行 view = itemView; ,无需这样做。

    现在您的 视图持有者 构造函数和声明应如下所示:

    public ImageButton image;
    public ImageView mostrarImagen
    
    public ViewHolder(View itemView) {
        super(itemView);
        image = itemView.findViewById(R.id.imagen);
        mostrarImagen = itemView.findViewById(R.id.mostrarImagen2);
    }
    

    当您使用 ImageButton 以及 ImageView 在里面 onBindViewHolder 不要这样做 findViewById 仅使用 viewHolder.image viewHolder.mostrarImagen

    关于您的 onClickListener onLongClickListener ,将它们放在 视图持有者 同学们,这里干净多了。把这些线放在你的 视图持有者 建造商:

    itemView.setOnClickListener(this);
    itemView.setOnLongClickListener(this);
    

    此外,请确保 视图持有者 机具 onClickListener 像这样:

    public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener
    

    然后在你的 视图持有者 类重写 onClickListener onLongClickListener :

    @Override
    public void onClick(View view) {
        // your code        
    }
    
    @Override
    public boolean onLongClick(View view) {
        // your code
        return true;
    }