【问题标题】:Getting contents of an item of a RecyclerView to another activity将 RecyclerView 的项目的内容获取到另一个活动
【发布时间】:2015-08-23 08:58:04
【问题描述】:

下面的类定义了电影的内容。

public class MovieCard {
String mAlbumArtURL;
String mName;
String mSynopsis;
String mRating;
String mReleaseDate;

public MovieCard(String albumArtURL, String name, String synopsis, String rating, String releaseDate) {
    this.mAlbumArtURL = albumArtURL;
    this.mName = name;
    this.mSynopsis = synopsis;
    this.mRating = rating;
    this.mReleaseDate = releaseDate;
}

public String getAlbumArtURL() {
    return mAlbumArtURL;
}

public void setAlbumArtURL(String mAlbumArtURL) {
    this.mAlbumArtURL = mAlbumArtURL;
}

public String getName() {
    return mName;
}

public void setName(String mName) {
    this.mName = mName;
}

public String getSynopsis() {
    return mSynopsis;
}

public void setSynopsis(String mSynopsis) {
    this.mSynopsis = mSynopsis;
}

public String getRating() {
    return mRating;
}

public void setRating(String mRating) {
    this.mRating = mRating;
}

public String getReleaseDate() {
    return mReleaseDate;
}

public void setReleaseDate(String mReleaseDate) {
    this.mReleaseDate = mReleaseDate;
}

}

应用程序的第一个活动提供了电影专辑艺术列表。用于渲染的数据是从 API 获取的。数据包括电影名称、上映日期、剧情简介等。但在第一个活动中只显示了海报(专辑封面)。现在,我将 OnclickListener 分配给 ViewHolder 类,以在用户单击任何海报时启动新活动。第二个活动需要包含点击的电影海报的详细信息。整个数据在第一个活动的 AsyncTask 中获取。我可以开始新活动,但我无法理解如何将单击的 ViewHolder 的所需内容发送到第二个活动。我知道数据是使用“putextra”发送的,但问题是我不知道要发送什么。我只能访问 ViewHolder 的位置,但不能访问其内容。

这是适配器的代码:

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.MovieCardHolder> {

List<MovieCard> mMovieCards;
Context context;

public CustomAdapter(List<MovieCard> cards, Context c) {
    this.mMovieCards = cards;
    this.context = c;
}

@Override
public CustomAdapter.MovieCardHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.movie_card, parent, false);
    MovieCardHolder movieCardHolder = new MovieCardHolder(view, context);
    return movieCardHolder;
}

@Override
public void onBindViewHolder(CustomAdapter.MovieCardHolder holder, int position) {
    holder.mMovieName.setText(mMovieCards.get(position).mName);
    Picasso.with(context).load(mMovieCards.get(position).mAlbumArtURL).into(holder.mMoviePoster);
}

@Override
public int getItemCount() {
    return mMovieCards.size();
}

public class MovieCardHolder extends RecyclerView.ViewHolder {
    ImageView mMoviePoster;
    TextView mMovieName;

    public MovieCardHolder(final View itemView, final Context context) {
        super(itemView);
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                // Need details of the movie to be sent to the next activity.

                Intent intent = new Intent(context,MovieDetail.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(intent);
            }
        });
        mMoviePoster = (ImageView) itemView.findViewById(R.id.movie_poster);
        mMovieName = (TextView) itemView.findViewById(R.id.movie_name);
    }
}

}

提前致谢。

【问题讨论】:

  • MovieCard 中的所有详细信息或从MovieDetail 类中的服务器检索?
  • 不,它们是在定义 RecyclerView 的第一个类中获取的。它们存储在包含 MovieCard 类对象的 Arraylist 中。

标签: android onclicklistener android-recyclerview android-viewholder


【解决方案1】:

您可以将MovieCard 附加到根View

public class MovieCardHolder extends RecyclerView.ViewHolder {
View root;
ImageView mMoviePoster;
TextView mMovieName;

public MovieCardHolder(final ViewGroup itemView, final Context context) {
    super(itemView);
    root = itemView;
    root.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

             // Need details of the movie to be sent to the next activity.
            MovieCard card = (MovieCard)v.getTag();
            Intent intent = new Intent(context, MovieDetail.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.putExtra("EXTRA_ART_URL", card.getAlbumArtURL());
            intent.putExtra("EXTRA_NAME", card.getName());
            intent.putExtra("EXTRA_Synopsis", card.getSynopsis());
            intent.putExtra("EXTRA_Rating", card.getRating());
            intent.putExtra("EXTRA_ReleaseDate", card.getReleaseDate());
            context.startActivity(intent);
        }
    });
    mMoviePoster = (ImageView) root.findViewById(R.id.movie_poster);
    mMovieName = (TextView) root.findViewById(R.id.movie_name);

    }
}

还有:

@Override
public void onBindViewHolder(CustomAdapter.MovieCardHolder holder, int position) {
    holder.root.setTag(mMovieCards.get(position));
    holder.mMovieName.setText(mMovieCards.get(position).mName);
    Picasso.with(context).load(mMovieCards.get(position).mAlbumArtURL).into(holder.mMoviePoster);
}

onCreate()MovieDetail方法中

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    String artUrl = getIntent().getStringExtra("EXTRA_ART_URL");
    //and so on to the rest of Strings
}

【讨论】:

  • Root 是您在 onCreateViewHolder() 中膨胀的视图。看看我的代码,我在你的 MovieCardHolder 作为字段中添加了这个视图。
  • 使用这个,我可能只是获得视图的位置,而我需要获得与点击的海报有关的电影的所有细节。
  • 您不需要任何东西,因为您将 MovieCard 的实例作为标签添加到单击的视图中,并且您只需调用 getTag() 就可以让他回来
  • 那么,既然我有了电影卡,我只需要在 putextra 中传递该对象并在下一个活动中检索它?
  • 如果你将类实现为 Parceable,你可以,但你可以把你需要的东西放在 putExtra() 中,它更容易。如果您不知道怎么做,我可以添加它来回答
【解决方案2】:

您可以通过mMovieCards.get(position) 获取所需的MovieCard

您需要通过实现将MovieCard 声明为Serializable,如下所示:

class MovieCard implements Serializable

并通过putExtras(String key, Serializable value) 下的Intent 发送它,最后使用您的onBindViewHolder() 回调。

@Override
public void onBindViewHolder(CustomAdapter.MovieCardHolder holder, int position) {
    // maybe declare a ViewGroup class member in your holder
    holder.parent.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent intent = new Intent(context, AnotherActivity.class);
                        intent.putExtra("my-object", mMovieCards.get(position));
                        context.startActivity(intent);
                    }
                });
}

在您的另一个活动中,像这样获取您的MovieCard

MovieCard m = (MovieCard) getIntent().getSerializableExtra("my-object");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    相关资源
    最近更新 更多