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

Kotlin中点击RecyclerView项通过Intent跳转至详情页的实现

解决方案

1. 修正MovieAdapter的ViewHolder

你的MovieAdapter里的ViewHolder错误引用了MovieActivity的控件(textTitle、textDescription、banner),这些控件属于详情页布局,并非列表项布局,必须删除。修改后的ViewHolder仅保留列表项的控件:

class MovieAdapter(val movies: List<MoviesItem>, val context: Context) : RecyclerView.Adapter<MovieAdapter.ViewHolder>() {
    class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){
        val txtTitle = itemView.findViewById<TextView>(R.id.txtTitle)
        val img = itemView.findViewById<ImageView>(R.id.image)
        val txtYear = itemView.findViewById<TextView>(R.id.txtYear)
        // 移除MovieActivity的控件引用
    }

    // 其他方法暂时不变
}

2. 给列表条目添加点击跳转逻辑

在onBindViewHolder中给itemView设置点击监听,通过Intent跳转到MovieActivity并传递当前电影数据。首先确保MoviesItem数据类实现Parcelable(推荐)或Serializable,方便对象传递:

修改MoviesItem数据类(示例):

@Parcelize
data class MoviesItem(
    val title: String,
    val releaseDate: String,
    val image: String,
    val description: String,
    val movieBanner: String
    // 其他字段按需添加
) : Parcelable

更新MovieAdapter的onBindViewHolder方法:

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    val movie : MoviesItem = movies[position]
    // 绑定列表项数据
    holder.txtTitle.text = movie.title
    holder.txtYear.text = movie.releaseDate
    Glide.with(context).load(movie.image).into(holder.img)

    // 添加点击跳转逻辑
    holder.itemView.setOnClickListener {
        val intent = Intent(context, MovieActivity::class.java)
        intent.putExtra("MOVIE_DATA", movie)
        context.startActivity(intent)
    }
}

同时将Adapter构造参数的Activity替换为更通用的Context,MainActivity中创建Adapter时直接传入this即可:

val adapter = MovieAdapter(response.body()!!, this@MainActivity)

3. 在MovieActivity中接收数据并展示

在MovieActivity的onCreate方法中获取Intent传递的电影数据,绑定到对应控件:

class MovieActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_movie)
        
        val movietitle = findViewById<TextView>(R.id.textTitle)
        val movieDesc = findViewById<TextView>(R.id.textDescription)
        val movieBanner = findViewById<ImageView>(R.id.banner)

        // 接收传递的电影数据
        val movie = intent.getParcelableExtra<MoviesItem>("MOVIE_DATA")
        
        movie?.let {
            movietitle.text = it.title
            movieDesc.text = it.description
            Glide.with(this).load(it.movieBanner).into(movieBanner)
        }
    }
}

4. 必要检查

  • 确保AndroidManifest.xml中已注册MovieActivity:
<activity android:name=".MovieActivity" />
  • 若无法使用Parcelable,可改用Serializable,只需将MoviesItem实现Serializable接口,接收数据时改为:
val movie = intent.getSerializableExtra("MOVIE_DATA") as? MoviesItem

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 09:11:54