Показать ImageView при нажатии на элемент адаптера (фотографии) RecyclerView на фрагмент - PullRequest
0 голосов
/ 08 мая 2018

У меня есть проблема, я читал об этом, и я не могу сделать это на OnBindViewHolder, но я использую это на других сайтах и ​​всегда та же ошибка ... После моей ошибки, которую я тоже использую, на LONG нажмите, чтобы сделать одну вещь, и она работает правильно, но перед этим я хочу использовать на Clock обычные, недолгие, потому что, когда я нажимаю, показать окно предупреждения с изображением (я пытаюсь сделать это с помощью viewview тоже нормально, без оповещения) но ничего, такая же ошибка ...

Я хочу с этим сделать одно фото из рециркуляции, открыть его из каталога и "увеличить" в окне оповещения ...

Код

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

Оповещение - это макет с одним изображением, я тестирую его с помощью android: src и drawable image, нажимаю, и оно работает ... Спасибо, ребята, я теряю много часов с этим xD

1 Ответ

0 голосов
/ 08 мая 2018

Удалить эту строку

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

И когда вы используете setImageBitmap доступ к image, как это

viewHolder.image.setImageBitmap(yourImage);

EDIT:

В вашем onBindViewHolder происходит много вещей, и вы раздуваете свои взгляды (findViewById) в разных местах. Вся эта работа должна быть перенесена на ViewHolder, с которой будет намного легче управлять.

Прежде всего, у вас есть эта строка дважды image = viewHolder.view.findViewById(R.id.imagen);, вам не нужно это делать, вам нужно сделать это только один раз, сделать это один раз в конструкторе ViewHolder и все.

Также эта строка ImageView mostrarImagen=(ImageView)viewHolder.view.findViewById(R.id.mostrarImagen2); лучше в вашем конструкторе ViewHolder, а не в onBindViewHolder.

После этого удалите View view из вашего ViewHolder и удалите эту строку и из конструктора view = itemView;, в этом нет необходимости.

Теперь ваш ViewHolder конструктор и объявление должны выглядеть примерно так:

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, поместите их в класс ViewHolder, это намного чище. Поместите эти строки в ваш ViewHolder конструктор:

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

Кроме того, убедитесь, что ваш ViewHolder реализует onClickListener следующим образом:

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

А затем в вашем ViewHolder переопределении класса onClickListener и onLongClickListener:

@Override
public void onClick(View view) {
    // your code        
}

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