单击 Fragment 上 RecyclerView 的 Adapter(Photos) 的 ITEM 时显示 ImageView
Show ImageView when click on ITEM of Adapter(Photos) of RecyclerView on Fragment
我有一个问题,我读到了它,但我不能在 OnBindViewHolder 上这样做,但我在其他网站上使用它并且总是出现同样的错误...
在我的错误之后我也使用了,在长按上做一件事并且它工作正常但在此之前我想使用正常的时钟,时间不长,因为当我点击时,显示一个带有图像的警告框(我尝试用图像视图来做到这一点也很正常,没有警报框)
但没有,同样的错误...
我想用它拍一张 recyclerview 的照片,然后从目录中打开它,然后在警告框中 "zoom"...
代码
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.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 和可绘制图片对其进行了测试,然后我点击它就可以工作了...
谢谢你们,我在这个 xD
上浪费了很多时间
删除此行
image = viewHolder.view.findViewById(R.id.imagen);
并且当您使用 setImageBitmap
访问 image
时那样
viewHolder.image.setImageBitmap(yourImage);
编辑:
你的 onBindViewHolder
发生了很多事情,你在不同的地方夸大了你的观点 (findViewById
)。所有这些工作都应该转移到 ViewHolder
上,这样会更容易管理。
首先,你有这行两次image = viewHolder.view.findViewById(R.id.imagen);
,你不需要这样做,你只需要做一次,在ViewHolder
构造函数中做一次就可以了.
此外,这一行 ImageView mostrarImagen=(ImageView)viewHolder.view.findViewById(R.id.mostrarImagen2);
在您的 ViewHolder
构造函数中更好,而不是在 onBindViewHolder
中。
之后,从你的 ViewHolder
中删除 View view
并从构造函数中删除这一行 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);
}
并且当您在 onBindViewHolder
中使用 ImageButton
和 ImageView
时,不要使用 findViewById
只需使用 viewHolder.image
和 viewHolder.mostrarImagen
.
关于你的 onClickListener
和 onLongClickListener
,把它们放在你的 ViewHolder
class 中,它更干净。将这些行放在 ViewHolder
构造函数中:
itemView.setOnClickListener(this);
itemView.setOnLongClickListener(this);
此外,请确保您的 ViewHolder
像这样实现 onClickListener
:
public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener
然后在你的 ViewHolder
class 覆盖 onClickListener
和 onLongClickListener
:
@Override
public void onClick(View view) {
// your code
}
@Override
public boolean onLongClick(View view) {
// your code
return true;
}
我有一个问题,我读到了它,但我不能在 OnBindViewHolder 上这样做,但我在其他网站上使用它并且总是出现同样的错误... 在我的错误之后我也使用了,在长按上做一件事并且它工作正常但在此之前我想使用正常的时钟,时间不长,因为当我点击时,显示一个带有图像的警告框(我尝试用图像视图来做到这一点也很正常,没有警报框) 但没有,同样的错误...
我想用它拍一张 recyclerview 的照片,然后从目录中打开它,然后在警告框中 "zoom"...
代码
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.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 和可绘制图片对其进行了测试,然后我点击它就可以工作了... 谢谢你们,我在这个 xD
上浪费了很多时间删除此行
image = viewHolder.view.findViewById(R.id.imagen);
并且当您使用 setImageBitmap
访问 image
时那样
viewHolder.image.setImageBitmap(yourImage);
编辑:
你的 onBindViewHolder
发生了很多事情,你在不同的地方夸大了你的观点 (findViewById
)。所有这些工作都应该转移到 ViewHolder
上,这样会更容易管理。
首先,你有这行两次image = viewHolder.view.findViewById(R.id.imagen);
,你不需要这样做,你只需要做一次,在ViewHolder
构造函数中做一次就可以了.
此外,这一行 ImageView mostrarImagen=(ImageView)viewHolder.view.findViewById(R.id.mostrarImagen2);
在您的 ViewHolder
构造函数中更好,而不是在 onBindViewHolder
中。
之后,从你的 ViewHolder
中删除 View view
并从构造函数中删除这一行 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);
}
并且当您在 onBindViewHolder
中使用 ImageButton
和 ImageView
时,不要使用 findViewById
只需使用 viewHolder.image
和 viewHolder.mostrarImagen
.
关于你的 onClickListener
和 onLongClickListener
,把它们放在你的 ViewHolder
class 中,它更干净。将这些行放在 ViewHolder
构造函数中:
itemView.setOnClickListener(this);
itemView.setOnLongClickListener(this);
此外,请确保您的 ViewHolder
像这样实现 onClickListener
:
public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener
然后在你的 ViewHolder
class 覆盖 onClickListener
和 onLongClickListener
:
@Override
public void onClick(View view) {
// your code
}
@Override
public boolean onLongClick(View view) {
// your code
return true;
}