android - 在 Android 中使用 Firebase 在单个 RecyclerView 中获取两个不同的 View

标签 android firebase youtube android-recyclerview android-viewholder

我开发了一个应用程序,其中有两个帖子

  • 使用毕加索的图片发布
  • 使用 Youtube Api 发布视频。

我已经通过使用 RecyclerViewFirebase recyclerAdapter 实现了两者,但问题是我不知道如何区分这两种 View ,如果我使用视频 View 使用 Youtube Api 它附加了 ImageView 并且还复制 到recyclerView 中的所有项目,然后所有项目中只有一个视频播放。我想要的是,如果我想显示图像,那么该项目只会获取图像,如果我想显示视频,那么 reyclerView 项目只会获取视频而不会重复。喜欢 Instagram。我搜索了很多论坛,但没有从他们那里得到任何帮助。请帮忙。我使用 Firebase 作为我的数据库,而 ViewHolders 是根据那个。

图像和视频帖子的类文件:

FirebaseRecyclerAdapter <post, postViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<post, postViewHolder>(
    post.class,
    R.layout.post_row_recycle_home,
    postViewHolder.class,
    mDatabaseReference
) {
    @Override
    protected void populateViewHolder(postViewHolder viewHolder, post model, int position) {
        viewHolder.setimage(getApplicationContext(), model.getImage());
        viewHolder.setYoutube(model.getYoutube()); 
    }
};

mrecyclerView.setAdapter(firebaseRecyclerAdapter);

持有人:

public static class postViewHolder extends RecyclerViewPager.ViewHolder{

    View mView;

    public postViewHolder(View itemView) {
        super(itemView);
        mView = itemView;
    }

    public void setYoutube(final String youtube){
        final YouTubePlayerView youPlay = (YouTubePlayerView) mView.findViewById(R.id.youtuber);
        youPlay.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 void setimage(final Context ctx, final String image){
        final ImageView post_image = (ImageView)mView.findViewById(R.id.post_image);

         Picasso.with(ctx).load(image)
            .networkPolicy(NetworkPolicy.OFFLINE).into(post_image, new Callback() {

            @Override
            public void onSuccess() {
            }
            @Override
            public void onError() {
                Picasso.with(ctx).load(image).into(post_image);
            }
        });
    }
}

示例截图:

enter image description here

最佳答案

您可以决定使用适配器 getItemViewType 方法显示哪种类型的 View 。在 firebaseRecyclerAdapter 中添加以下内容:

private static final int TYPE_YOUTUBE = 1111;
private static final int TYPE_IMAGE = 2222;

@Override
public int getItemViewType(int position) {
    //note: classes should start with uppercase
    Post model = getItem(position);
    if (model.isYoutube()) { //note: you'll have to define this method
        return TYPE_YOUTUBE; 
    } else {
        return TYPE_IMAGE;
    }
}

然后在 onCreateViewHolder 中检查要创建的类型:

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    RecyclerView.ViewHolder holder;
    switch (viewType) {
        case TYPE_YOUTUBE:
                //note: save an inflater when you construct the adapter
                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));
        }

    }

分离您的 VH 模型:

public abstract class PostViewHolder extends RecyclerView.ViewHolder { //note: extends changed
    public abstract void bind(final String input){
}

public static class YtViewHolder extends PostViewHolder { //note: extends changed

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

}

然后您的填充方法可以简化如下:

@Override
protected void populateViewHolder(PostViewHolder viewHolder, post model, int position) {
    viewHolder.bind(model.isYoutube()? model.getYoutube() : model.getImage());
}

不同的项目:

then there is only one video playing in all items

这有点令人担忧。如果我理解正确的话,列表中的每一项都具有相同的图像和视频。这可能意味着您要将相同的模型返回到每个位置。确保如果您实现 getItem,您会为每个位置返回不同的项目(默认情况下,Firebase 适配器会这样做)。还要确保 model.getYoutube 等不返回静态数据。

关于android - 在 Android 中使用 Firebase 在单个 RecyclerView 中获取两个不同的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46216540/

相关文章:

android - 流媒体库 VLC Android

angularjs - SEO - 如何要求爬虫在爬行之前等待数据加载?

java - MessagingErrorCode 的成员对应什么错误码?

Android 应用索引 -> FirebaseAppIndexingInvalidArgumentException

android - fragment 中的抽屉导航和 SurfaceView

android - libssl 和 libcrypto 的 undefined reference 错误

Android HTTPRequest 周期

iframe - Youtube - 如何在嵌入链接/&lt;iframe&gt; 中强制使用 480p 视频质量

iphone - 如何在ViewController的底部使用多个Webview?

javascript - Firefox 上的 Flexslider 和 YouTube Iframe API 出现问题 ("* is not a function")