如何从RecyclerView获取电影名称字符串用于Intent putExtra传参
问题描述
我实现了用于展示电影列表的RecyclerView,需要获取电影名称字段通过Intent的putExtra方法完成参数传递。目前我已经编写了点击监听器,能够正常获取适配器点击位置,但仅能返回适配器对应的数组对象,logcat输出仅能打印数组对象信息,无法直接拿到电影名称字段。
尝试了多种实现方式,始终只能返回数组对象值,无法获取到电影名称对应的字符串值用于Intent传参。
现有RecyclerView适配器代码如下:
public class movieRecyclerViewAdapter extends RecyclerView.Adapter<movieRecyclerViewAdapter.myViewHolder> { private static final String TAG = "movieRecyclerViewAdapter"; private onMovieClickListener movieClickListener; private final ArrayList<movie> movies; public movieRecyclerViewAdapter(ArrayList<movie> movieArrayList, onMovieClickListener onMovieClickListener){ this.movies = movieArrayList; this.movieClickListener = onMovieClickListener; Log.d("mainMenuAdmin", "Adapter List size : " + movieArrayList.size() ); } @NonNull @Override public movieRecyclerViewAdapter.myViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_movie, parent, false); return new myViewHolder(view, movieClickListener); } @Override public void onBindViewHolder(@NonNull movieRecyclerViewAdapter.myViewHolder holder, int position) { Log.d(TAG, "onBindViewHolder: called"); String img = movies.get(position).getMovie_image(); holder.judul.setText(movies.get(position).getNamaMovie()); holder.tahun.setText(movies.get(position).getTahunMovie()); Picasso.get().load(img).error(R.mipmap.ic_launcher).placeholder(R.mipmap.ic_launcher_round).into(holder.image); } @Override public int getItemCount() { return movies.size(); } public static class myViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ private final TextView judul, tahun; private final ImageView image; RelativeLayout parent; onMovieClickListener onMovieClickListener; public myViewHolder(@NonNull View itemView, onMovieClickListener onMovieClickListener) { super(itemView); judul = itemView.findViewById(R.id.txtJudul); tahun = itemView.findViewById(R.id.txtTahun); image = itemView.findViewById(R.id.imagePoster); parent = itemView.findViewById(R.id.parent_layout); this.onMovieClickListener = onMovieClickListener; itemView.setOnClickListener(this); } @Override public void onClick(View view) { onMovieClickListener.onMovieClick(view, this.getLayoutPosition()); } } public interface onMovieClickListener{ void onMovieClick(View v, int position); }}
解决方法
你已经拿到了点击条目的position参数,直接用该位置从绑定的电影数据源中取出对应对象,调用对象的getNamaMovie()方法就能拿到电影名称字符串,不需要额外修改视图绑定逻辑。
- 方法一:直接在点击回调中通过position取值(无需修改现有适配器代码)
在实现onMovieClickListener接口的Activity/Fragment中,重写onMovieClick方法时,用传入的position从你传给适配器的电影列表中取对应对象即可:
@Override public void onMovieClick(View v, int position) { // 取出点击位置对应的电影实体对象,movieList为你传入适配器的ArrayList<movie>数据源 movie clickedMovie = movieList.get(position); // 调用getter方法获取电影名称字符串 String movieName = clickedMovie.getNamaMovie(); // 放入Intent完成传参 Intent intent = new Intent(CurrentActivity.this, TargetActivity.class); intent.putExtra("MOVIE_NAME", movieName); startActivity(intent); }
注意:该方法需要你在Activity/Fragment中持有传给适配器的电影列表引用,不要在传参后把列表引用置空。
- 方法二:修改适配器点击接口,直接回传电影对象(无需在页面持有数据源引用)
只需要修改两处代码,回调中可以直接拿到点击的电影对象,不用手动处理位置对应关系:
- 修改点击接口定义,将参数从位置改为电影实体对象:
public interface onMovieClickListener{ void onMovieClick(View v, movie clickedMovie); }
- 修改ViewHolder的点击事件逻辑,取出对应位置的电影对象传给接口:
@Override public void onClick(View view) { int clickPos = getLayoutPosition(); // 判空避免位置越界 if (clickPos != RecyclerView.NO_POSITION) { onMovieClickListener.onMovieClick(view, movies.get(clickPos)); } }
修改完成后,在页面的点击回调中可以直接拿到电影对象,调用getNamaMovie()就能获取名称字符串用于传参。
内容的提问来源于stack exchange,提问作者Federico Alie
相关产品推荐
相关产品推荐

