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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:01:01