You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何ArrayList中的Book对象无法通过onClickListener传递至第二个Activity?

解决Activity间传递Book对象填充字段失败的问题

嘿,我来帮你排查这个问题!从你描述的情况来看——能硬编码填充第二个Activity,但点击列表项传递Book对象时不行——核心问题大概率是自定义对象的序列化没做好,或者Intent传递/接收的环节出了疏漏。我给你一步步拆解解决:

第一步:确保Book类实现序列化接口

Android中通过Intent传递自定义对象,必须让对象实现Serializable或者Parcelable接口(后者是Android推荐的高效方式)。很多人会忽略这一步,导致对象根本传不过去。

方案1:实现Serializable(简单易上手)

public class Book implements Serializable {
    // 注意:如果Book类有其他自定义对象成员,这些成员也要实现Serializable
    private int id;
    private String title;
    private String author;

    // 构造函数
    public Book(int id, String title, String author) {
        this.id = id;
        this.title = title;
        this.author = author;
    }

    // 必须添加上getter方法,方便后续获取字段值
    public int getId() { return id; }
    public String getTitle() { return title; }
    public String getAuthor() { return author; }
}

方案2:实现Parcelable(Android推荐,效率更高)

public class Book implements Parcelable {
    private int id;
    private String title;
    private String author;

    public Book(int id, String title, String author) {
        this.id = id;
        this.title = title;
        this.author = author;
    }

    // Parcelable必备的构造方法,用于从Parcel中读取对象
    protected Book(Parcel in) {
        id = in.readInt();
        title = in.readString();
        author = in.readString();
    }

    // Parcelable必备的Creator
    public static final Creator<Book> CREATOR = new Creator<Book>() {
        @Override
        public Book createFromParcel(Parcel in) {
            return new Book(in);
        }

        @Override
        public Book[] newArray(int size) {
            return new Book[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    // 将对象写入Parcel,传递给下一个Activity
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(id);
        dest.writeString(title);
        dest.writeString(author);
    }

    // getter方法不能少
    public int getId() { return id; }
    public String getTitle() { return title; }
    public String getAuthor() { return author; }
}

第二步:在OnClickListener中正确传递Book对象

假设你是给列表项(比如ListView/RecyclerView的item)设置点击事件,传递代码要这么写:

// 以ListView为例,RecyclerView的点击逻辑类似
listView.setOnItemClickListener((parent, view, position, id) -> {
    // 获取当前点击的Book对象
    Book selectedBook = bookList.get(position);
    // 创建跳转到详情Activity的Intent
    Intent intent = new Intent(getActivity(), BookDetailsActivity.class);
    
    // 传递对象——两种序列化方式的写法一致
    intent.putExtra("SELECTED_BOOK", selectedBook);
    
    // 如果你用的是startActivityForResult(看你代码里有REQUEST_BOOK_DETAILS)
    startActivityForResult(intent, REQUEST_BOOK_DETAILS);
});

第三步:在第二个Activity中接收并填充字段

到了详情Activity,要正确取出对象并填充UI:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_book_details);

    // 获取传递过来的Intent
    Intent intent = getIntent();
    if (intent != null) {
        Book book = null;
        // 根据你实现的序列化方式选择对应方法
        // 如果是Serializable
        book = (Book) intent.getSerializableExtra("SELECTED_BOOK");
        // 如果是Parcelable
        // book = intent.getParcelableExtra("SELECTED_BOOK");

        // 填充UI字段
        if (book != null) {
            TextView titleTv = findViewById(R.id.tv_book_title);
            TextView authorTv = findViewById(R.id.tv_book_author);
            
            titleTv.setText(book.getTitle());
            authorTv.setText(book.getAuthor());
        }
    }
}

最后检查几个常见坑

  • 传递时的key(比如"SELECTED_BOOK")要和接收时完全一致,大小写也不能错
  • 如果Book类里有其他自定义对象成员,那这些成员也必须实现Serializable/Parcelable
  • 确保bookList里的对象确实是初始化好的(比如你代码里的book0已经添加到bookList了)

这样调整后,应该就能正常传递Book对象并填充第二个Activity的字段啦!

内容的提问来源于stack exchange,提问作者Azerty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:24:47