web-dev-qa-db-fra.com

Je ne trouve pas la méthode populateViewHolder dans la classe FirebaseRecyclerAdapter

Je veux utiliser FirebaseRecyclerAdapter dans mon projet et j'ai utilisé ce segment de code dans un projet précédent

FirebaseRecyclerAdapter<ChatMessage, ChatMessageViewHolder> adapter = new FirebaseRecyclerAdapter<ChatMessage, ChatMessageViewHolder>(ChatMessage.class, Android.R.layout.two_line_list_item, ChatMessageViewHolder.class, ref) {
              public void populateViewHolder(ChatMessageViewHolder chatMessageViewHolder, ChatMessage chatMessage, int position) {
                  chatMessageViewHolder.nameText.setText(chatMessage.getName());
                  chatMessageViewHolder.messageText.setText(chatMessage.getMessage());
              }
          };
         recycler.setAdapter(mAdapter);

et cela fonctionnait bien mais maintenant cela ne fonctionne plus. La nouvelle version de FirebaseUi contient-elle des mises à jour qui ne me permettent pas de réutiliser ce code maintenant?

J'ai essayé cela dans mon projet

 @Override
    protected void onStart() {
        super.onStart();
        FirebaseRecyclerAdapter<BlogModel, BlogListViewHolder> adapter = new FirebaseRecyclerAdapter<BlogModel, BlogListViewHolder>(BlogModel.class, Android.R.layout.two_line_list_item, BlogListViewHolder.class, mDatabaseReference) {
            public void populateViewHolder(BlogListViewHolder blogListViewHolder, BlogModel blogModel, int position) {
                blogListViewHolder.postTitle.setText(blogModel.getPostTitle());
                blogListViewHolder.postDesc.setText(blogModel.getPostDesc());

            }
        };
        mBlogList.setAdapter(adapter);
    }

et Android Studio génère une erreur indiquant que vous devez implémenter la méthode onCreateViewHolder,onBindViewHolder.

Classe BlogListViewHolder

public static class BlogListViewHolder extends RecyclerView.ViewHolder {

        ImageView postImage;
        TextView postTitle;
        TextView postDesc;

        public BlogListViewHolder(View view) {
            super(view);
            postImage = view.findViewById(R.id.blog_image_id);
            postTitle = view.findViewById(R.id.blog_title_id);
            postDesc = view.findViewById(R.id.blog_desc_id);
            view.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                }
            });

        }

    }

J'utilise ces dépendances  

dependencies {



 compile fileTree(dir: 'libs', include: ['*.jar'])
        androidTestCompile('com.Android.support.test.espresso:espresso-core:2.2.2', {
            exclude group: 'com.Android.support', module: 'support-annotations'
        })
        compile 'com.Android.support:appcompat-v7:26.0.2'
        compile 'com.google.firebase:firebase-auth:11.4.2'
        compile 'com.google.firebase:firebase-database:11.4.2'
        compile 'com.google.firebase:firebase-storage:11.4.2'
        compile 'com.firebaseui:firebase-ui-database:3.1.0'
        compile 'com.firebaseui:firebase-ui-firestore:3.1.0'
        compile 'com.firebaseui:firebase-ui-auth:3.1.0'
        compile 'com.firebaseui:firebase-ui-storage:3.1.0'
        testCompile 'junit:junit:4.12'
        compile 'com.squareup.picasso:picasso:2.5.2'

    }
    apply plugin: 'com.google.gms.google-services'
6
Mohamed AdelraZek

La syntaxe a changé. La section du document décrivant les appels est ici:

https://github.com/firebase/FirebaseUI-Android/blob/master/database/README.md

Voici le fichier de classement de l'application avec les versions de base de données Firebase et FirebaseUI:

// FirebaseUI for Firebase Realtime Database
compile 'com.firebaseui:firebase-ui-database:3.1.0'
compile 'com.google.firebase:firebase-database:11.4.2'

J'ai les classes ViewHolder et Model standard définies. Je vais les laisser pour la brièveté.

Variables d'instance en haut de ma classe Fragment:

private RecyclerView mPeopleRV;
private FirebaseRecyclerAdapter<PersonModel, PeopleVH> mPeopleRVAdapter;

Dans onCreateView () de mon fragment:

mPeopleRV = v.findViewById(R.id.peopleRV);

Dans onActivityStarted () de mon fragment est l'endroit où se trouve toute l'action. 

onCreateViewHolder est l'endroit où la disposition des lignes est gonflée. Et bindViewHolder () est l'endroit où vous remplissez la ligne avec les données de votre modèle extraites de Firebase.

Le constructeur de l'adaptateur prend désormais un ensemble d'options que vous définissez en fonction de votre requête et de votre modèle.

    DatabaseReference personsRef = FirebaseDatabase.getInstance().getReference().child("People");
    Query personsQuery = personsRef.orderByKey();

    mPeopleRV.hasFixedSize();
    mPeopleRV.setLayoutManager(new LinearLayoutManager(getActivity()));

    FirebaseRecyclerOptions personsOptions = new FirebaseRecyclerOptions.Builder<PersonModel>().setQuery(personsQuery, PersonModel.class).build();

    mPeopleRVAdapter = new FirebaseRecyclerAdapter<PersonModel, PeopleVH>(personsOptions) {
        @Override
        protected void onBindViewHolder(PeopleVH holder, int position, PersonModel model) {
            holder.setPersonFirstName(model.getFirstName());
            holder.setPersonLastName(model.getLastName());
        }

        @Override
        public PeopleVH onCreateViewHolder(ViewGroup parent, int viewType) {

            View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.single_row_people_rv, parent, false);

            return new PeopleVH(view);
        }
    };

    mPeopleRV.setAdapter(mPeopleRVAdapter);

Ajouté plus tard:

N'oubliez pas de démarrer et d'arrêter le programme d'écoute de l'adaptateur dans onStart () et onStop ():

@Override
public void onStart() {
    super.onStart();
    mPeopleRVAdapter.startListening();
}

@Override
public void onStop() {
    super.onStop();
    mPeopleRVAdapter.stopListening();
}
10
Lucy

En plus de la réponse de @ Lucy . Maintenant, il existe des propriétaires de cycle de vie de composant d'architecture . Selon le doc Android de firestoreui

Si vous ne souhaitez pas démarrer/arrêter manuellement l'écoute, vous pouvez utiliser Android Architecture Components pour gérer automatiquement le cycle de vie de la FirestoreRecyclerAdapter. Passez une LifecycleOwner à FirestoreRecyclerOptions.Builder.setLifecycleOwner(...) et FirebaseUI démarrera et arrêtera automatiquement l'écoute dans onStart() et onStop().

Dans cette situation spécifique, personsOptions.setLifecycleOwner(myFragmentOrActivity.this)

0