在 recyclerview 项目上单击 show recyclerview data custom in toDialog Box
Posted
技术标签:
【中文标题】在 recyclerview 项目上单击 show recyclerview data custom in toDialog Box【英文标题】:on recyclerview item click show recyclerview data custom in toDialog Box 【发布时间】:2019-03-16 18:56:02 【问题描述】:我的活动中有 recyclerview
。当用户单击recyclerview
项目时,我想显示我的自定义对话框并将 recyclerview 项目数据显示到对话框中,recyclerview 工作正常,但问题是当我单击该项目时,应用程序不幸停止并出现一些错误
这是我的日志
进程:com.example.ajsoft.test,PID:5290 java.lang.ArrayIndexOutOfBoundsException:长度=18;指数=-1 在 java.util.ArrayList.get(ArrayList.java:310) 在 com.example.ajsoft.test.RecyclerViewAdapter$1.onClick(RecyclerViewAdapter.java:50) 在 android.view.View.performClick(View.java:4780) 在 android.view.View$PerformClick.run(View.java:19866) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:135) 在 android.app.ActivityThread.main(ActivityThread.java:5254) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
RecyclerViewAdapter 代码
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder>
private Context mContext ;
private List<Book> mData ;
Dialog myDialog;
public RecyclerViewAdapter(Context mContext, List<Book> mData)
this.mContext = mContext;
this.mData = mData;
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
View view ;
LayoutInflater mInflater = LayoutInflater.from(mContext);
view = mInflater.inflate(R.layout.my,parent,false);
final MyViewHolder vHolder =new MyViewHolder(view);
myDialog =new Dialog(mContext);
myDialog.setContentView(R.layout.vx);
vHolder.cardView.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
TextView dialog_name=(TextView)myDialog.findViewById(R.id.name);
ImageView dialog_image=(ImageView)myDialog.findViewById(R.id.image);
dialog_name.setText(mData.get(vHolder.getAdapterPosition()).getTitle());
dialog_image.setImageResource(mData.get(vHolder.getAdapterPosition()).getThumbnail());
myDialog.show();
);
return new MyViewHolder(view);
@Override
public void onBindViewHolder(MyViewHolder holder, final int position)
holder.tv_book_title.setText(mData.get(position).getTitle());
holder.img_book_thumbnail.setImageResource(mData.get(position).getThumbnail());
@Override
public int getItemCount()
return mData.size();
public static class MyViewHolder extends RecyclerView.ViewHolder
TextView tv_book_title;
ImageView img_book_thumbnail;
CardView cardView ;
public MyViewHolder(View itemView)
super(itemView);
tv_book_title = (TextView) itemView.findViewById(R.id.name) ;
img_book_thumbnail = (ImageView) itemView.findViewById(R.id.image);
cardView = (CardView) itemView.findViewById(R.id.cv);
【问题讨论】:
【参考方案1】:问题在于您的 onCreateViewHolder()
方法的这一部分:
final MyViewHolder vHolder =new MyViewHolder(view); ... vHolder.cardView.setOnClickListener(new View.OnClickListener() @Override public void onClick(View v) ... ); return new MyViewHolder(view);
您返回的MyViewHolder
实例与创建OnClickListener
时使用的实例不同。这意味着侦听器中的vHolder
变量引用了一个从未添加到RecyclerView 的ViewHolder,因此它的位置将始终为-1
。
您可以通过更改 return 语句以使用原始 ViewHolder 来修复它:
return vHolder;
【讨论】:
【参考方案2】:在您的代码中添加此更改:
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
View view ;
LayoutInflater mInflater = LayoutInflater.from(mContext);
view = mInflater.inflate(R.layout.my,parent,false);
myDialog =new Dialog(mContext);
myDialog.setContentView(R.layout.vx);
return new MyViewHolder(view);
@Override
public void onBindViewHolder(MyViewHolder holder, final int position)
holder.tv_book_title.setText(mData.get(position).getTitle());
holder.img_book_thumbnail.setImageResource(mData.get(position).getThumbnail());
holder.cardView.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
TextView dialog_name=(TextView)myDialog.findViewById(R.id.name);
ImageView dialog_image=(ImageView)myDialog.findViewById(R.id.image);
dialog_name.setText(mData.get(vHolder.getAdapterPosition()).getTitle());
dialog_image.setImageResource(mData.get(vHolder.getAdapterPosition()).getThumbnail());
myDialog.show();
);
希望对你有所帮助..!
【讨论】:
【参考方案3】:ArrayIndexOutOfBoundsException 当您尝试访问超出范围的数组索引时会导致此异常(因此得名)。
@Ben 提供了索引超出范围的上述原因。我认为他的解决方案应该在这里有效。
【讨论】:
以上是关于在 recyclerview 项目上单击 show recyclerview data custom in toDialog Box的主要内容,如果未能解决你的问题,请参考以下文章
Android - 在 RecyclerView 中单击的项目上打开新活动 [重复]
RecyclerView 项目单击正在模拟器上工作,但在 kotlin 中的物理上没有
单击后退按钮时,在 RecyclerView 中获得相同的项目位置
如何在单击 RecyclerView 项目时从一个片段移动到另一个片段