Running into an error when trying to put my bundle into my intent in an onClickListener() inside a RecyclerView CustomViewHolder.
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.os.Bundle.putString(java.lang.String, java.lang.String)' on a null object reference
I've also attempted to create a new bundle rather than using the extras, but get the same error as above. Oddly enough the putExtras() way works fine with one variable, passes across correctly, but alas I have about 8 different variables to insert for the secondary page.
Code is as follows:
public void onClick(View view) {
intent = new Intent(itemView.getContext(), CardActivity.class);
extras = intent.getExtras();
extras.putString(CARD_IMG, cardList.Basic.get(getAdapterPosition()).getImg());
extras.putString(CARD_FLAVOR, cardList.Basic.get(getAdapterPosition()).getFlavor());
extras.putString(CARD_TEXT, cardList.Basic.get(getAdapterPosition()).getText());
extras.putString(CARD_TYPE, cardList.Basic.get(getAdapterPosition()).getType());
extras.putString(CARD_ARTIST, cardList.Basic.get(getAdapterPosition()).getArtist());
extras.putString(CARD_SET, cardList.Basic.get(getAdapterPosition()).getCardSet());
extras.putString(CARD_RARITY, cardList.Basic.get(getAdapterPosition()).getRarity());
extras.putString(CARD_NAME, cardList.Basic.get(getAdapterPosition()).getName());
intent.putExtras(extras);
itemView.getContext().startActivity(intent);
}
Any help or nudges in the right direction would be greatly appreciated.
Thanks ahead of time!
Edit: I've included the full file below incase that helps. Thanks for the responses so far guys, greatly appreciated.
public class RecyclerAdaptor extends RecyclerView.Adapter<RecyclerAdaptor.CustomViewHolder> {
//for bundle keys
private static final String CARD_FLAVOR = "CARD_FLAVOR";
private static final String CARD_TYPE = "CARD_TYPE";
private static final String CARD_ARTIST = "CARD_ARTIST";
private static final String CARD_SET = "CARD_SET";
private static final String CARD_RARITY = "CARD_RARITY";
private static final String CARD_NAME = "CARD_NAME";
private static final String CARD_IMG = "CARD_IMG";
private static final String CARD_TEXT = "CARD_TEXT";
private static Intent intent;
public static Bundle extras;
public static CardList cardList;
public RecyclerAdaptor(CardList cardList) {
this.cardList = cardList;
}
@Override
//Number of Items
public int getItemCount() {
return cardList.Basic.size();
}
@Override
public RecyclerAdaptor.CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.card_row, parent, false);
CustomViewHolder holder = new CustomViewHolder(v);
return holder;
}
@Override
public void onBindViewHolder(RecyclerAdaptor.CustomViewHolder holder, int position) {
final Card card = cardList.Basic.get(position);
String cost = "0";
// Could have made values protected in class, but meh
holder.cardName.setText(card.getName());
holder.cardText.setText(card.getText());
holder.cardFlavor.setText(card.getFlavor());
// Handles dust value of card
if (card.getRarity() != null) {
switch (card.getRarity()) {
case "Common": cost = "40";
break;
case "Rare": cost = "100";
break;
case "Epic": cost = "400";
break;
case "Legendary": cost = "1600";
break;
}
}
holder.cardCost.setText(cost);
Picasso.with(holder.cardImg.getContext()).load(card.getImg()).into(holder.cardImg);
}
public static class CustomViewHolder extends RecyclerView.ViewHolder {
private TextView cardName;
private TextView cardText;
private TextView cardFlavor;
private TextView cardCost;
private GifImageView cardImg;
private Button moreButton;
public CustomViewHolder(final View itemView) {
super(itemView);
cardName = itemView.findViewById(R.id.cardTitle);
cardText = itemView.findViewById(R.id.cardText);
cardFlavor = itemView.findViewById(R.id.cardFlavor);
cardCost = itemView.findViewById(R.id.dustTextView);
cardImg = itemView.findViewById(R.id.cardImgView);
moreButton = itemView.findViewById(R.id.moreButton);
moreButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(itemView.getContext(), "Clicked:" + getAdapterPosition(), Toast.LENGTH_SHORT).show();
intent = new Intent(itemView.getContext(), CardActivity.class);
extras = intent.getExtras();
if(extras == null){
extras = new Bundle();
}
extras.putString(CARD_IMG, cardList.Basic.get(getAdapterPosition()).getImg());
extras.putString(CARD_FLAVOR, cardList.Basic.get(getAdapterPosition()).getFlavor());
extras.putString(CARD_TEXT, cardList.Basic.get(getAdapterPosition()).getText());
extras.putString(CARD_TYPE, cardList.Basic.get(getAdapterPosition()).getType());
extras.putString(CARD_ARTIST, cardList.Basic.get(getAdapterPosition()).getArtist());
extras.putString(CARD_SET, cardList.Basic.get(getAdapterPosition()).getCardSet());
extras.putString(CARD_RARITY, cardList.Basic.get(getAdapterPosition()).getRarity());
extras.putString(CARD_NAME, cardList.Basic.get(getAdapterPosition()).getName());
intent.putExtras(extras);
itemView.getContext().startActivity(intent);
}
});
}
}
}
Complete error is as follows:
01-29 12:32:07.961 3030-3030/com.venaseph.hearthlopedia E/AndroidRuntime: FATAL EXCEPTION: main Process: com.venaseph.hearthlopedia, PID: 3030 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.venaseph.hearthlopedia/com.venaseph.hearthlopedia.CardActivity}: java.lang.IllegalArgumentException: Target must not be null. at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892) at android.app.ActivityThread.-wrap11(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593) at android.os.Handler.dispatchMessage(Handler.java:105) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6541) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) Caused by: java.lang.IllegalArgumentException: Target must not be null. at com.squareup.picasso.RequestCreator.into(RequestCreator.java:618) at com.squareup.picasso.RequestCreator.into(RequestCreator.java:601) at com.venaseph.hearthlopedia.CardActivity.getBundleValues(CardActivity.java:41) at com.venaseph.hearthlopedia.CardActivity.onCreate(CardActivity.java:33) at android.app.Activity.performCreate(Activity.java:6975) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892) at android.app.ActivityThread.-wrap11(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593) at android.os.Handler.dispatchMessage(Handler.java:105) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6541) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
In addition, if I leave everything as is and take away the intent.putExtras, it doesn't crash.