android - No puedo encontrar el método populateViewHolder en la clase FirebaseRecyclerAdapter
firebase-realtime-database firebaseui (2)
Quiero usar
FirebaseRecyclerAdapter
en mi proyecto y usé este segmento de código en un proyecto anterior
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);
y funcionaba bien, pero ahora ya no funciona. ¿Hay alguna actualización en la nueva versión de
FirebaseUi
que no me permita reutilizar este código ahora?
Intenté esto en mi proyecto
@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);
}
y Android Studio da un error que dice que debe implementar
onCreateViewHolder,onBindViewHolder
método
onCreateViewHolder,onBindViewHolder
.
Clase 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) {
}
});
}
}
Yo uso estas dependencias
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''
Además de la respuesta de @ Lucy. Ahora, hay propietarios de ciclo de vida de componentes de arquitectura. Según el documento de Android firestoreui
Si no desea iniciar / detener la escucha manualmente, puede usar los Componentes de Arquitectura de Android para administrar automáticamente el ciclo de vida del
FirestoreRecyclerAdapter
.
Pase un
LifecycleOwner
a
FirestoreRecyclerOptions.Builder.setLifecycleOwner(...)
y FirebaseUI comenzará y dejará de escuchar
onStart()
en
onStart()
y
onStop()
.
En esta situación específica,
personsOptions.setLifecycleOwner(myFragmentOrActivity.this)
La sintaxis ha cambiado. La sección del documento que describe las llamadas está aquí:
https://github.com/firebase/FirebaseUI-Android/blob/master/database/README.md
Aquí está el archivo gradle de la aplicación con Firebase Database y FirebaseUI versiones:
// FirebaseUI for Firebase Realtime Database
compile ''com.firebaseui:firebase-ui-database:3.1.0''
compile ''com.google.firebase:firebase-database:11.4.2''
Tengo definidas las clases estándar ViewHolder y Model. Los dejaré afuera por brevedad.
Variables de instancia en la parte superior de mi clase Fragment:
private RecyclerView mPeopleRV;
private FirebaseRecyclerAdapter<PersonModel, PeopleVH> mPeopleRVAdapter;
En onCreateView () de mi Fragmento:
mPeopleRV = v.findViewById(R.id.peopleRV);
En onActivityStarted () de mi Fragmento es donde está toda la acción.
onCreateViewHolder es donde se infla el diseño de la fila. Y bindViewHolder () es donde rellena la fila con los datos de su modelo obtenidos de Firebase.
El constructor para el adaptador ahora toma un conjunto de opciones que usted define en función de su consulta y modelo.
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);
Agregado más tarde:
No olvide iniciar y detener la escucha del adaptador en onStart () y onStop ():
@Override
public void onStart() {
super.onStart();
mPeopleRVAdapter.startListening();
}
@Override
public void onStop() {
super.onStop();
mPeopleRVAdapter.stopListening();
}