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

Android中如何在Activity间传递已解析的ArrayList<News>数据

解决Android跨Activity传递News对象的方案

推荐方案:让DataClass实现Parcelable

Android官方优先推荐用Parcelable做组件间对象传递,比Serializable性能高,而且Kotlin的DataClass可以用注解快速实现,完全不会给其他代码带来额外负担。

具体步骤:

  1. 配置gradle支持Parcelize注解
    在Module级别的build.gradle里加以下配置:
    android {
        ...
        kotlinOptions {
            jvmTarget = "1.8"
            freeCompilerArgs += "-Xplugin=org.jetbrains.kotlinx:kotlinx-parcelize-plugin:1.1.0"
        }
    }
    dependencies {
        ...
        implementation "org.jetbrains.kotlinx:kotlinx-parcelize-runtime:1.1.0"
    }
    
  2. 修改News DataClass
    加个@Parcelize注解就行,不用手动写序列化代码:
    import kotlinx.parcelize.Parcelize
    import android.os.Parcelable
    
    @Parcelize
    data class News(
        val title: String,
        val content: String,
        // 你的其他字段
    ) : Parcelable
    
  3. Adapter里传递单个News对象
    点击列表项时,把当前点击的News对象传到Intent里:
    itemView.setOnClickListener {
        val targetNews = newsList[position]
        val intent = Intent(context, NewsDetailsActivity::class.java)
        intent.putExtra("SELECTED_NEWS", targetNews)
        context.startActivity(intent)
    }
    
  4. NewsDetails里接收并使用
    直接取出对象,就能像主Activity那样访问字段:
    val selectedNews = intent.getParcelableExtra<News>("SELECTED_NEWS")
    selectedNews?.run {
        titleTv.text = title
        contentTv.text = content
    }
    

备选方案:传递新闻ID重新请求详情

如果实在不想动DataClass,就传新闻的唯一ID,在详情页单独请求该新闻的数据。缺点是多一次网络请求,适合新闻本身有唯一标识的场景:

  • Adapter点击事件传ID:
    itemView.setOnClickListener {
        val newsId = newsList[position].id
        val intent = Intent(context, NewsDetailsActivity::class.java)
        intent.putExtra("NEWS_ID", newsId)
        context.startActivity(intent)
    }
    
  • 详情页请求数据:
    val newsId = intent.getIntExtra("NEWS_ID", -1)
    if (newsId != -1) {
        // 调用你的API接口获取单条新闻详情
        yourApiService.getNewsDetail(newsId).enqueue(object : Callback<News> {
            override fun onResponse(call: Call<News>, response: Response<News>) {
                response.body()?.let { news ->
                    titleTv.text = news.title
                }
            }
            override fun onFailure(call: Call<News>, t: Throwable) {
                // 处理请求失败逻辑
            }
        })
    }
    

为啥不选你提到的两种方法?

  • 传JSON再重新解析:纯纯浪费性能,已经解析好的对象没必要再走一遍解析流程,代码也冗余。
  • 用Serializable:Java的老序列化方式,性能比Parcelable差不少,Android对Parcelable做了专门优化,更适合移动端场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 20:13:38