You can select the type of display that will be shown using the adapters getItemViewType. Inside, firebaseRecyclerAdapteradd the following:
private static final int TYPE_YOUTUBE = 1111;
private static final int TYPE_IMAGE = 2222;
@Override
public int getItemViewType(int position) {
Post model = getItem(position);
if (model.isYoutube()) {
return TYPE_YOUTUBE;
} else {
return TYPE_IMAGE;
}
}
Then inside onCreateViewHolderyou check what type to create:
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
RecyclerView.ViewHolder holder;
switch (viewType) {
case TYPE_YOUTUBE:
return new YtViewHolder(inflater.inflate(R.layout.item_youtube, parent, false));
case TYPE_IMAGE:
return new ImgViewHolder(inflater.inflate(R.layout.item_image, parent, false));
}
}
Separate your VH models:
public abstract class PostViewHolder extends RecyclerView.ViewHolder {
public abstract void bind(final String input){
}
public static class YtViewHolder extends PostViewHolder {
private YouTubePlayerView mView;
public YtViewHolder(View itemView) {
super(itemView);
mView = (YouTubePlayerView) itemView.findViewById(R.id.youtuber);
}
public void bind(final String youtube){
mView.initialize("SOME KEY",
new YouTubePlayer.OnInitializedListener() {
@Override
public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean b) {
youTubePlayer.cueVideo(youtube);
}
@Override
public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) {
}
});
}
}
public static class ImgViewHolder extends PostViewHolder {
private ImageView mView;
public ImageView(View itemView) {
super(itemView);
mView = (ImageView) itemView.findViewById(R.id.post_image);
}
public void bind(final String image){
Picasso.with(mView.getContext()).load(image).networkPolicy(NetworkPolicy.OFFLINE).into(mView, new Callback() {
@Override
public void onSuccess() {
}
@Override
public void onError() {
Picasso.with(ctx).load(image).into(mView);
}
});
}
}
Then your fill method can be simplified as follows:
@Override
protected void populateViewHolder(PostViewHolder viewHolder, post model, int position) {
viewHolder.bind(model.isYoutube()? model.getYoutube() : model.getImage());
}
Various items:
then in all elements only one video will be played
. , . , , , . , getItem, ( Firebase ). , model.getYoutube .. .