【问题标题】:on recyclerview item click show recyclerview data custom in toDialog Box在 recyclerview 项目上单击 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);


    }
}


}

【问题讨论】:

    标签: android android-recyclerview onitemclick


    【解决方案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 提供了索引超出范围的上述原因。我认为他的解决方案应该在这里有效。

        【讨论】:

          猜你喜欢
          • 2019-12-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-03
          相关资源
          最近更新 更多