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