Android开发求助:RecyclerView传递MovieId至另一个Activity失败
问题:RecyclerView点击传递MovieId到详情Activity失败
我是编程新手,已经通过API获取电影数据并在RecyclerView中展示,现在需要把RecyclerView中对应电影的MovieId传递到show_Movies Activity来展示电影详情,但没法完成数据传递。以下是相关代码:
主类Real_home
package com.example.login import android.annotation.SuppressLint import android.content.Intent import android.os.Bundle import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.example.login.Tmdb.moviesIns import retrofit2.Call import retrofit2.Callback import retrofit2.Response class Real_home : Fragment(){ private lateinit var adapter: Adapter override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { return inflater.inflate(R.layout.fragment_real_home, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) getData() } @SuppressLint("SuspiciousIndentation") private fun getData() { val movies = moviesIns.getMovies(1) movies.enqueue(object : Callback<Movie> { override fun onResponse(call: Call<Movie>, response: Response<Movie>) { val movie66 = response.body() if (movie66!=null) Log.d("hello", response.toString()) adapter= Adapter(this@Real_home, movie66!!.results) val Lemmetry= view!!.findViewById<RecyclerView>(R.id.Lemmetry) Lemmetry.adapter=adapter Lemmetry.layoutManager= LinearLayoutManager(activity,LinearLayoutManager.HORIZONTAL,false) adapter.onItemClick= { val intent = Intent(activity,show_Movies::class.java).apply { } startActivity(intent) } } override fun onFailure(call: Call<Movie>, t: Throwable) { Log.d("hello", "onFailure: Something went wrong") } }) } private fun ino(result: com.example.login.Result) { } }
Adapter类
package com.example.login import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide class Adapter(val context: Real_home, val MovieList: List<Result>) : RecyclerView.Adapter<Adapter.ViewHolder>() { var onItemClick:((show_Movies)->Unit)? = null override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val inflate= LayoutInflater.from(parent.context) val view = inflate.inflate(R.layout.card,parent,false) return ViewHolder(view) } override fun getItemCount(): Int { return MovieList.size } override fun onBindViewHolder(holder:ViewHolder, position: Int) { val realMovies= MovieList[position] Glide.with(context).load("https://image.tmdb.org/t/p/w500"+ realMovies.poster_path).into(holder.Pics) holder.itemView.setOnClickListener { onItemClick?.invoke(show_Movies()) } } class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { var Pics= itemView.findViewById<ImageView>(R.id.pics) } }
目标Activity类show_Movies
package com.example.login import android.annotation.SuppressLint import android.os.Bundle import androidx.appcompat.app.AppCompatActivity class show_Movies : AppCompatActivity() { @SuppressLint("MissingInflatedId", "CheckResult") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_show_movies) val extras = intent.extras } }
解决方法
你的问题出在点击回调的参数传递错误,以及没有正确把MovieId放入Intent中,按以下步骤修改:
- 修改Adapter的点击回调类型
把Adapter中onItemClick的参数类型从show_Movies改成Result,因为我们需要传递的是点击的电影数据,而不是Activity实例:
// Adapter类中修改这一行 var onItemClick: ((Result) -> Unit)? = null
- Adapter中点击时传递当前电影数据
在onBindViewHolder的点击事件里,传递当前的realMovies而不是新建show_Movies():
holder.itemView.setOnClickListener { onItemClick?.invoke(realMovies) }
- 在Real_home中传递MovieId到Intent
修改adapter.onItemClick的回调逻辑,获取点击的电影对象,把它的id通过putExtra放入Intent:
adapter.onItemClick = { clickedMovie -> val intent = Intent(activity, show_Movies::class.java).apply { // 假设Result类中有id字段,字段名根据你的实际情况调整 putExtra("MOVIE_ID", clickedMovie.id) } startActivity(intent) }
- 在show_Movies中接收MovieId
在onCreate方法中获取传递过来的MovieId:
@SuppressLint("MissingInflatedId", "CheckResult") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_show_movies) val movieId = intent.getIntExtra("MOVIE_ID", -1) // -1是默认值,表示未获取到 // 这里就可以用movieId去请求电影详情数据了 }
这样就能完成MovieId从RecyclerView到详情Activity的传递了。
内容的提问来源于stack exchange,提问作者k1rit0
相关产品推荐
相关产品推荐

