如何在Kotlin中通过Intent传递对象数组并展示设施名称
解决方案
1. 传递多个设施名称的正确方式
方式一:直接传递名称列表(String集合)
String本身实现了Serializable,可以直接通过Intent传递整个名称列表,适合只需要展示名称的场景:
在ListAllAdapter的点击事件中:
// 从API返回的facilities中提取所有name val facilityNames = item.facilities.map { it.name } val intent = Intent(context, DetailActivity::class.java).apply { putStringArrayListExtra("EXTRA_FACILITY_NAMES", ArrayList(facilityNames)) } context.startActivity(intent)
方式二:传递完整Facility对象列表(推荐)
如果后续可能需要使用设施的其他字段,让Facility数据类实现Parcelable,传递完整对象更利于扩展:
首先定义Parcelable数据类:
import android.os.Parcelable import kotlinx.parcelize.Parcelize @Parcelize data class Facility( val name: String, // 可添加其他字段如id、iconUrl等 ) : Parcelable
然后在适配器中传递:
val intent = Intent(context, DetailActivity::class.java).apply { putParcelableArrayListExtra("EXTRA_FACILITIES", ArrayList(item.facilities)) } context.startActivity(intent)
2. 在DetailActivity中接收并展示
场景一:用TextView快速展示
如果只需要简单罗列名称,接收后拼接成格式化字符串:
class DetailActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_detail) val facilityNames = intent.getStringArrayListExtra("EXTRA_FACILITY_NAMES") val facilitiesTv = findViewById<TextView>(R.id.tv_facilities) facilitiesTv.text = facilityNames?.joinToString(separator = "\n• ") { "• $it" } ?: "暂无设施信息" } }
场景二:用RecyclerView展示(适合大量数据)
需要更美观的列表展示时,使用RecyclerView:
先创建简易适配器:
class FacilityAdapter(private val names: List<String>) : RecyclerView.Adapter<FacilityAdapter.ViewHolder>() { inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { val nameTv: TextView = itemView.findViewById(R.id.tv_facility_name) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val view = LayoutInflater.from(parent.context) .inflate(R.layout.item_facility, parent, false) return ViewHolder(view) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { holder.nameTv.text = names[position] } override fun getItemCount() = names.size }
然后在DetailActivity中配置:
class DetailActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_detail) val facilityNames = intent.getStringArrayListExtra("EXTRA_FACILITY_NAMES") ?: emptyList() val rvFacilities = findViewById<RecyclerView>(R.id.rv_facilities) rvFacilities.layoutManager = LinearLayoutManager(this) rvFacilities.adapter = FacilityAdapter(facilityNames) } }
注意事项
- 使用Parcelable时,需在模块的build.gradle中添加
kotlin-parcelize插件:
plugins { // 其他插件 id 'kotlin-parcelize' }
- 若设施数量极大,建议用ViewModel或全局单例暂存数据,避免Intent传递过大数据导致异常
内容的提问来源于stack exchange,提问作者Chishiya
相关产品推荐
相关产品推荐

