Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法在片段中的RecyclerView中获取onClick事件_Java_Android_Android Studio_Android Fragments_Recyclerview Layout - Fatal编程技术网

Java 无法在片段中的RecyclerView中获取onClick事件

Java 无法在片段中的RecyclerView中获取onClick事件,java,android,android-studio,android-fragments,recyclerview-layout,Java,Android,Android Studio,Android Fragments,Recyclerview Layout,我正在使用Json为我的应用程序获取数据和图像。图像显示在连接到MainActivity的片段Tab1.java内部的RecyclerView中。我希望以这样的方式进行设置,这样当用户在RecyclerView中单击一个图像时,就会启动一个新的Activity ViewImage.java并在那里显示该图像 到目前为止,我已经能够获取Json数据并将其显示在回收器视图中。图像显示得非常完美,但当我试图设置setItemOnClickListener时,应用程序开始崩溃,我在Tab1.java中用

我正在使用Json为我的应用程序获取数据和图像。图像显示在连接到MainActivity的片段Tab1.java内部的RecyclerView中。我希望以这样的方式进行设置,这样当用户在RecyclerView中单击一个图像时,就会启动一个新的Activity ViewImage.java并在那里显示该图像

到目前为止,我已经能够获取Json数据并将其显示在回收器视图中。图像显示得非常完美,但当我试图设置setItemOnClickListener时,应用程序开始崩溃,我在Tab1.java中用注释标记了这一行

Tab1.java


正如您已经知道的,此方法在RecyclerView类中不再可用

我在RecyclerView中实现onClick事件的方法如下:

class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {

    interface OnClickListener {
        void onClick(Item item);
    }

    private final List<Item> dataset;
    private final OnClickListener l; 

    public MyAdapter(List<Item> data, OnClickListener listener) {
        this.dataset = data;
        this.l = listener;
    }

    @Override MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = //inflate layout
        MyClick click = new MyClick() {
            onClick(int position) {
                if (l != null) {
                    l.onClick(dataset.get(position));
                }
            }
        };
        return new MyViewHolder(click, v);
    }

    static class MyViewHolder {
        final MyClick l;

        public MyViewHolder(MyClick listener, View view) {
            super(view);
            l = listener;
            // inflate views
            view.setOnClickListener(new OnClickListener() {
                if (l != null) {
                    l.onClick(getAdapterPosition());
                }
            });
        }

        interface MyClick {
            void onClick(int position);
        }
    }
}

class MyActivity extends AppCompatActivity {

    @Override void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // set layout
        MyAdapter adapter = new MyAdapter(getData(), new OnClickListener() {
            @Override onClick(Item item) {
                // do stuff with item
            }
        });
    }
}

看一下,将该行更改为mCardAdapter.setItemOnClickListenerTab1.this@米肯。谢谢你,这对我有用。
public class CardAdapter extends RecyclerView.Adapter<CardAdapter.CardViewHolder> {
  private Context mContext;
  private ArrayList<Card> mCardList;
  private OnItemClickListener mListener;

  public interface OnItemClickListener {
    void onItemClick(int position);
  }

  public void setItemOnClickListener(OnItemClickListener listener) {
    mListener = listener;
  }

  public CardAdapter(Context context, ArrayList<Card> cardList) {
    mContext = context;
    mCardList = cardList;
  }

  @Override
  public CardViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(mContext).inflate(R.layout.card, parent, false);
    return new CardViewHolder(v);
  }

  @Override
  public void onBindViewHolder(CardViewHolder holder, int position) {
    Card currentItem = mCardList.get(position);

    String imageUrl = currentItem.getImageUrl();
    String countryName = currentItem.getCountryName();
    int rank = currentItem.getRank();

    holder.mTextViewCountry.setText(countryName);
    holder.mTextViewRank.setText("Rank: " + rank);

    Picasso.get().load(imageUrl).fit().centerInside().into(holder.mImageView);
  }

  @Override
  public int getItemCount() {
    return mCardList.size();
  }

  public class CardViewHolder extends RecyclerView.ViewHolder {
    public ImageView mImageView;
    public TextView mTextViewCountry;
    public TextView mTextViewRank;

    public CardViewHolder(View itemView) {
      super(itemView);
      mImageView = itemView.findViewById(R.id.image_view);
      mTextViewCountry = itemView.findViewById(R.id.text_view_country_name);
      mTextViewRank = itemView.findViewById(R.id.text_view_rank);

      itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
          if (mListener != null) {
            int position = getAdapterPosition();
            if (position != RecyclerView.NO_POSITION) {
              mListener.onItemClick(position);
            }
          }
        }
      });
    }
  }
}
public class viewimage extends appcompatactivity {

  @override
  protected void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.activity_view_image);
    // imageview where the image is to be displayed in this activity
    imageview imageview = findviewbyid(r.id.fullscreenimage);

    bundle bundle = getintent().getextras();
    if (bundle != null) {
      string imageurl = bundle.getstring("extra_url");
      if (imageurl != null) {
        picasso.get().load(imageurl).fit().centerinside().into(imageview);
      }
    }
  }
}
class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {

    interface OnClickListener {
        void onClick(Item item);
    }

    private final List<Item> dataset;
    private final OnClickListener l; 

    public MyAdapter(List<Item> data, OnClickListener listener) {
        this.dataset = data;
        this.l = listener;
    }

    @Override MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = //inflate layout
        MyClick click = new MyClick() {
            onClick(int position) {
                if (l != null) {
                    l.onClick(dataset.get(position));
                }
            }
        };
        return new MyViewHolder(click, v);
    }

    static class MyViewHolder {
        final MyClick l;

        public MyViewHolder(MyClick listener, View view) {
            super(view);
            l = listener;
            // inflate views
            view.setOnClickListener(new OnClickListener() {
                if (l != null) {
                    l.onClick(getAdapterPosition());
                }
            });
        }

        interface MyClick {
            void onClick(int position);
        }
    }
}

class MyActivity extends AppCompatActivity {

    @Override void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // set layout
        MyAdapter adapter = new MyAdapter(getData(), new OnClickListener() {
            @Override onClick(Item item) {
                // do stuff with item
            }
        });
    }
}