首页 文章

RecyclerView中的捆绑问题

提问于
浏览
0

尝试将我的包放入 onClickListener() onClickListener() 中的我的意图时遇到错误 .

java.lang.NullPointerException:尝试在空对象引用上调用虚方法'void android.os.Bundle.putString(java.lang.String,java.lang.String)'

我还试图创建一个新的包而不是使用额外的,但得到与上面相同的错误 . 奇怪的是 putExtras() 方式适用于一个变量,正确传递,但是我有大约8个不同的变量要插入辅助页面 .

代码如下:

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

任何帮助或推动正确的方向将不胜感激 .

提前谢谢!

编辑:我已经包含了以下有用的完整文件 . 感谢您回复到目前为止,非常感谢 .

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

    }
}
}

完整错误如下:

01-29 12:32:07.961 3030-3030 / com.venaseph.hearthlopedia E / AndroidRuntime:FATAL EXCEPTION:main进程:com.venaseph.hearthlopedia,PID:3030 java.lang.RuntimeException:无法启动活动ComponentInfo {com .venaseph.hearthlopedia / com.venaseph.hearthlopedia.CardActivity}:java.lang.IllegalArgumentException:Target不能为null . 在Android.app.A活动中的android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)android.app.A活动时,我在android.app.A活动时发现了android.app.A活动,发送活动(ActivityThread.java:2892) . ActivityThread $ H.handleMessage(ActivityThread.java:1593)位于android.app.AooT.Thread.main的android.os.Handler.dispatchMessage(Handler.java:105)android.os.Looper.loop(Looper.java:164) (ActivityThread.java:6541)位于com.android.internal.os的com.android.internal.os.Zygote $ MethodAndArgsCaller.run(Zygote.java:240)的java.lang.reflect.Method.invoke(Native Method) .ZygoteInit.main(ZygoteInit.java:767)引起:java.lang.IllegalArgumentException:Target不能为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) )在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)的android.app.Activity.performCreate(Activity.java:6975)上的com.venaseph.hearthlopedia.CardActivity.onCreate(CardActivity.java:33) Android.app.ActivityThread $中android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)的android.app.ActivityThread.-wrap11(未知来源:0)的.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770) H.handleMessage(ActivityThread.java:1593)位于android.app.AooT.Thread.main上的android.os.Handler.dispatchMessage(Handler.java:105)android.os.Looper.loop(Looper.java:164)(ActivityThread) .java:6541)在java.lang.reflect.Method.invoke(Native Method)的com.android.internal.os.Zygote $ MethodAndArgsCaller.run(Zygote.java:240)at at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

另外,如果我按原样保留所有内容并删除intent.putExtras,它不会崩溃 .

3 回答

  • 0

    那是因为你的 intentnull ,用以下代码替换

    public void onClick(View view) {
        intent = new Intent(itemView.getContext(), CardActivity.class);
        extras = new Bundle(); //<-- so that bundle wont be null anymore
            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);
    }
    
  • 0

    因为 bundle 为空因此 Null Pointer Exception .

    只是实例化 bundle 并添加值 .

    public void onClick(View view) {
        intent = new Intent(itemView.getContext(), CardActivity.class);
        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);
    }
    
  • 0

    试试这个
    Edit

    public void onClick(View view) {
        Intent intent = new Intent(itemView.getContext(), CardActivity.class);
        Bundle extras = new Bundle();
        if (extras != null) {
            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);
        }
    }
    

相关问题