7
votes

Obtenir deux vues différentes dans un seul recyclerview en utilisant Firebase à Android

J'ai développé une application dans laquelle il y a deux messages

  • L'image post à l'aide de Picasso LI>
  • Le poste vidéo à l'aide de YouTube API. LI> ul>

    J'ai mis en œuvre à la fois en utilisant recyclerview strong> et Firebase recycleradapter strong> mais le problème est que je ne sais pas comment différencier les deux vues, si j'utilise la vidéo Afficher utiliser API YOUTUBE STRUT> C'EST ATTACHÉ AVEC VUE D'IMAGE ET AUSSI COPIE STRAND> à tous les éléments de RecyclERView, puis il n'y a qu'une seule vidéo dans tous les articles. Ce que je veux, c'est que si je veux montrer une image, l'élément obtient uniquement l'image et si je veux afficher la vidéo, l'élément REYCLERVIEW obtient uniquement une vidéo sans répétition. Comme Instagram strong>. J'ai cherché beaucoup de forums mais je n'ai aucune aide d'eux. S'il vous plaît aider. J'utilise Firebase car ma base de données et les porteurs de vues sont selon cela. P>

    fichier de classe pour les postes d'images et de vidéos: strong> p> xxx pré>

    Support: P>

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


2 commentaires

Essayez ceci ceci.SetisRecyClable (FALSE); Dans votre constructeur PostView propriétaire (vue)


RecycleView ne trouve pas la vue à chaque fois sa vue de la vue une seule fois, alors essayez d'utiliser ListView pour cela.


3 Réponses :


2
votes

Utiliser simplement ViewType > va résoudre ce problème pour vous.

Tout d'abord FirebaserecyClerAdapter Code> devrait inclure recyclerview.viewholder.class code> au lieu de PostViewholder.class code> p>

alors vous basculez entre le type de chaque enfant supposent Image Carry Type 1 CODE> ET TYPE DE CORPS DE VIDEO 2 CODE> Et vous atteignez cela dans ONCreateViewholder code> entre vous gérer que dans getItemViewTtype code>

Le code doit être ressemblant à: - p> xxx pré>

OnCreatView doit être ressemblant à: - p>

@Override
        public int getItemViewType(int position) {
            post model = getItem(position);
            switch (model.getType()) {
                case 1:
                    return model1;
                case 2:
                    return model2;

            }
            return super.getItemViewType(position);
        }


3 commentaires

Où allais-je utiliser load.image et youplay.cuevideo ()?


@Rohitb Toutes les modifications doivent être dans PopulateVolderholder Case 1 Vous gérez la vue de l'image et du boîtier 2 que vous traitez de la vue pour la vidéo.


Vous avez fait quelques erreurs dans ce code - par exemple Model1 et Model2 ne sont pas définies. Les classes de visualiseur vous utilisez pas non plus. Au fait, il n'y a aucune raison qu'il ne peut pas utiliser un titulaire de la vue personnalisé (porteur d'après-vente) comme vous le souhaitez.



10
votes

Vous pouvez choisir le type de vision à afficher avec les adaptateurs getItemViewTtype code> méthode. Intérieur FirebaserecyClerAdapter Code> Ajoutez les éléments suivants:

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


3 commentaires

Ce qui devrait être défini dans "si (modèle.isyoutube ()) {// note: vous devrez définir cette méthode revenir type_youtube;"


Et dois-je ajouter un getter et un setter dans post.class pour ce "modèle de message = getItem (position);"


La méthode isyoutube est ce dont vous avez besoin pour définir. getItem est une méthode de l'adaptateur. Vous devriez étudier le Recyclerview Bases de base



-1
votes

Préseniers de la vue avec deux vues xxx


0 commentaires