на элементе утилита просмотра нажмите кнопку Показать данные утилита просмотра в диалоговом окне - PullRequest
0 голосов
/ 11 октября 2018

У меня есть recyclerview в моей деятельности.Когда пользователь щелкает элемент recyclerview, я хочу показать свое настраиваемое диалоговое окно и отображать в нем данные об элементе recyclerview, recylerview работает нормально, но проблема в том, что когда я щелкаю элемент, приложение, к сожалению, останавливается с некоторой ошибкой

Вот мой logcat

Процесс: com.example.ajsoft.test, PID: 5290 java.lang.ArrayIndexOutOfBoundsException: length = 18;index = -1 в java.util.ArrayList.get (ArrayList.java:310) в com.example.ajsoft.test.RecyclerViewAdapter $ 1.onClick (RecyclerViewAdapter.java:50) в android.view.View.performClick (Просмотреть.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.отражения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);


    }
}


}

Ответы [ 3 ]

0 голосов
/ 11 октября 2018

Проблема заключается в этой части вашего 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 внутри слушателя ссылается на ViewHolder, который никогда не был добавлен в RecyclerView, поэтому его положение всегда будет -1.

. Вы можете исправить это, изменив оператор return наиспользуйте оригинальный ViewHolder:

return vHolder;
0 голосов
/ 11 октября 2018

ArrayIndexOutOfBoundsException Это исключение вызывается, когда вы пытаетесь получить доступ к индексу массива, который находится за пределами (отсюда и имя).

@ Бен указал выше причину, по которой индекс вышел за границы.Я думаю, что его решение должно работать здесь.

0 голосов
/ 11 октября 2018

Добавьте эти изменения в ваш код:

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

Надеюсь, это поможет вам! ..

...