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
相关产品推荐
相关产品推荐

