Android Studio Kotlin卡片跳转及MutableList传递至列表组件方案
实现方案步骤
1. 规范数据类与初始化数据源
先修正数据类命名符合Kotlin规范,再初始化首页卡片数据源:
// 实现Parcelable接口用于跨页面传递 import android.os.Parcelable import kotlinx.parcelize.Parcelize @Parcelize data class Detail(var id: String, var image: Int, var title: String) : Parcelable // 首页4个卡片的数据源 val homeCardData = mutableListOf( Detail("villa", R.drawable.ic_villa, "Villa"), Detail("apartment", R.drawable.ic_apartment, "Apartment"), Detail("hotel", R.drawable.ic_hotel, "Hotel"), Detail("resort", R.drawable.ic_resort, "Resort") )
注:需在app级build.gradle中添加Parcelize插件:
plugins { id 'kotlin-parcelize' }
2. 首页卡片列表实现(RecyclerView)
用RecyclerView展示首页卡片并设置点击跳转逻辑:
2.1 首页布局(activity_home.xml)
<androidx.recyclerview.widget.RecyclerView android:id="@+id/homeRecyclerView" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="16dp" app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" app:spanCount="2"/>
2.2 卡片项布局(item_home_card.xml)
<androidx.cardview.widget.CardView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="8dp" app:cardCornerRadius="8dp"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="16dp" android:gravity="center"> <ImageView android:id="@+id/cardImage" android:layout_width="80dp" android:layout_height="80dp"/> <TextView android:id="@+id/cardTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:textSize="16sp" android:textStyle="bold"/> </LinearLayout> </androidx.cardview.widget.CardView>
2.3 首页RecyclerView适配器
class HomeCardAdapter( private val dataList: List<Detail>, private val onCardClick: (Detail) -> Unit ) : RecyclerView.Adapter<HomeCardAdapter.ViewHolder>() { inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { val cardImage: ImageView = itemView.findViewById(R.id.cardImage) val cardTitle: TextView = itemView.findViewById(R.id.cardTitle) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val view = LayoutInflater.from(parent.context) .inflate(R.layout.item_home_card, parent, false) return ViewHolder(view) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { val item = dataList[position] holder.cardImage.setImageResource(item.image) holder.cardTitle.text = item.title holder.itemView.setOnClickListener { onCardClick(item) } } override fun getItemCount() = dataList.size }
2.4 首页Activity逻辑
class HomeActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_home) val recyclerView = findViewById<RecyclerView>(R.id.homeRecyclerView) recyclerView.adapter = HomeCardAdapter(homeCardData) { detail -> // 根据卡片ID跳转对应页面并传递数据 val targetActivity = when(detail.id) { "villa" -> VillaListActivity::class.java "apartment" -> ApartmentListActivity::class.java "hotel" -> HotelListActivity::class.java "resort" -> ResortListActivity::class.java else -> return@HomeCardAdapter } val intent = Intent(this, targetActivity).apply { putParcelableArrayListExtra("list_data", ArrayList(homeCardData)) } startActivity(intent) } } }
3. 目标页面接收数据并展示(以VillaListActivity为例)
3.1 目标页面布局(activity_villa_list.xml)
<androidx.recyclerview.widget.RecyclerView android:id="@+id/villaRecyclerView" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="8dp"/>
3.2 目标页面列表适配器
class VillaListAdapter(private val dataList: List<Detail>) : RecyclerView.Adapter<VillaListAdapter.ViewHolder>() { inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { val itemImage: ImageView = itemView.findViewById(R.id.itemImage) val itemTitle: TextView = itemView.findViewById(R.id.itemTitle) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val view = LayoutInflater.from(parent.context) .inflate(R.layout.item_villa_list, parent, false) return ViewHolder(view) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { val item = dataList[position] holder.itemImage.setImageResource(item.image) holder.itemTitle.text = item.title } override fun getItemCount() = dataList.size }
3.3 目标Activity接收数据
class VillaListActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_villa_list) // 接收传递的数据源,为空则返回空列表 val dataList = intent.getParcelableArrayListExtra<Detail>("list_data") ?: mutableListOf() val recyclerView = findViewById<RecyclerView>(R.id.villaRecyclerView) recyclerView.layoutManager = LinearLayoutManager(this) recyclerView.adapter = VillaListAdapter(dataList) } }
常见问题排查
- 确保所有跳转的Activity已在
AndroidManifest.xml中注册 - 检查Parcelable接口是否正确实现,否则无法跨页面传递数据
- 确认RecyclerView的
layoutManager已设置,否则列表无法显示 - 检查Intent传递数据的key与接收时的key完全一致
内容的提问来源于stack exchange,提问作者Badriya Haddad
相关产品推荐
相关产品推荐

