0

I have a recyclerview on my activity. When user click the recyclerview item i want to show my custom dialog box and show recyclerview item data into the dialog box, recylerview is working fine but problem is when i click the item the app is unfortunately stopped with some error

Here is my logcat

Process: com.example.ajsoft.test, PID: 5290 java.lang.ArrayIndexOutOfBoundsException: length=18; index=-1 at java.util.ArrayList.get(ArrayList.java:310) at com.example.ajsoft.test.RecyclerViewAdapter$1.onClick(RecyclerViewAdapter.java:50) at android.view.View.performClick(View.java:4780) at android.view.View$PerformClick.run(View.java:19866) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5254) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

RecyclerViewAdapter Code

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);


    }
}


}
Phantômaxx
  • 37,901
  • 21
  • 84
  • 115

3 Answers3

2

The issue is in this portion of your onCreateViewHolder() method:

final MyViewHolder vHolder =new MyViewHolder(view);
...
vHolder.cardView.setOnClickListener(new View.OnClickListener() {
    @Override 
    public void onClick(View v) { 
        ...
    }
});
return new MyViewHolder(view);

You're returning a different instance of MyViewHolder than the one you're using when you create the OnClickListener. That means that the vHolder variable inside the listener is referring to a ViewHolder that was never added to the RecyclerView, so its position will always be -1.

You can fix it by changing the return statement to use the original ViewHolder:

return vHolder;
Ben P.
  • 52,661
  • 6
  • 95
  • 123
0

Add this changes in your code:

@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(); }
      });
}

Hope it will help you..!

Mohamed Mohaideen AH
  • 2,527
  • 1
  • 16
  • 24
0

ArrayIndexOutOfBoundsException This exception is caused when you are trying to access an index of an array which is out of bound (hence the name).

@Ben has provided the reason above why the index is out of bound. I think his solution should work here.