0

В приведенном ниже классе определяется содержимое фильма.Получение содержимого элемента RecyclerView для другого действия

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); 
    } 
} 

}

Спасибо заранее.

+0

Все детали в 'MovieCard' или извлечения с сервера в классе' MovieDetail'? –

+0

Нет, они выбраны в первом классе, где определен RecyclerView. Они хранятся в Arraylist, содержащем объекты класса MovieCard. –

ответ

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); 
} 

В MovieDetail методом onCreate()

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

Что такое root? –

+0

Корень - это вид, который вы завысили в onCreateViewHolder(). Посмотрите на мой код, я добавил этот вид в свой MovieCardHolder в качестве поля. – yshahak

+0

Используя это, я могу просто получить позицию представления, в то время как мне нужно получить все детали фильма, относящиеся к плакату, нажатому. –

0

Вы можете сделать mMovieCards.get(position), чтобы получить MovieCard, который вы хотите.

Вы должны объявить MovieCard в Serializable по его реализации, как это:

class MovieCard implements Serializable 

и отправить его через Intent под putExtras(String key, Serializable value) Наконец с помощью 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"); 
Смежные вопросы