Android中如何在Activity间传递已解析的ArrayList<News>数据
解决Android跨Activity传递News对象的方案
推荐方案:让DataClass实现Parcelable
Android官方优先推荐用Parcelable做组件间对象传递,比Serializable性能高,而且Kotlin的DataClass可以用注解快速实现,完全不会给其他代码带来额外负担。
具体步骤:
- 配置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" } - 修改News DataClass
加个@Parcelize注解就行,不用手动写序列化代码:import kotlinx.parcelize.Parcelize import android.os.Parcelable @Parcelize data class News( val title: String, val content: String, // 你的其他字段 ) : Parcelable - 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) } - 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
相关产品推荐
相关产品推荐

