Why I Cant Use the Populateviewholder Override Method

Why I cant use the populateViewHolder override method?

The constructor of the Firebase...Adapter classes has changed in FirebaseUI version 3. Given this query:

Query query = FirebaseDatabase.getInstance()
.getReference()
.child("users")
.equalTo(name);

If you're using a version 3 or higher, you use FirebaseRecyclerOptions:

 FirebaseRecyclerOptions<model_class_name> options =
new FirebaseRecyclerOptions.Builder<model_class_name>()
.setQuery(query, model_class_name.class)
.build();

Then declare a FirebaseRecyclerAdapter:

FirebaseRecyclerAdapter adapter = new FirebaseRecyclerAdapter<Chat, ChatHolder>(options) {

add the variable options as above. It is the variable of the class FirebaseRecyclerOptions

Then to add items you have to use onBindViewHolder since its the latest version of firebase ui:

 @Override
protected void onBindViewHolder(Holder holder, int position, model_class_name model) {
// Bind the class object to the holder
// ...
}

For more info check this: https://github.com/firebase/FirebaseUI-Android/tree/master/database

I can't find populateViewHolder Method in FirebaseRecyclerAdapter class

The syntax has changed. The section of the doc outlining the calls is here:

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

Here is the app gradle file with Firebase Database and FirebaseUI versions:

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

I have standard ViewHolder and Model classes defined. I'll leave them out for brevity.

Instance variables at top of my Fragment class:

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

In onCreateView() of my Fragment:

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

In onActivityStarted() of my Fragment is where all the action is.

onCreateViewHolder is where the row layout gets inflated. And bindViewHolder() is where you populate the row with your model data fetched from Firebase.

The constructor for the adapter now takes a set of options that you define based on your query and model.

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

Added later:

Don't forget to start and stop the adapter listener in onStart() and onStop():

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

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

RecyclerAdapter with Firebase - Where is populateViewHolder?

The FirebaseUI migration guide is a good place to start. Essentially, you'll want to do something like this:

FirebaseRecyclerOptions<NoteModel> options = new FirebaseRecyclerOptions.Builder<>()
.setQuery(fNotesDatabase, NoteModel.class)
.build();

FirebaseRecyclerAdapter<NoteModel, NoteViewHolder> firebaseRecyclerAdapter =
new FirebaseRecyclerAdapter<NoteModel, NoteViewHolder>(options) {
@Override
public NoteViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new NoteViewHolder(LayoutInflater.from(parent.getContext())
.inflate(R.layout.single_note_layout, parent, false));
}

@Override
protected void onBindViewHolder(@NonNull NoteViewHolder holder,
int position,
@NonNull NoteModel model) {
String key = getSnapshots().getSnapshot(position).getKey();
holder.bind(...);
}
};

populateViewHolder not executing with FirebaseRecyclerAdapter (Android)

I fixed my problem thanks to this doc :

https://codelabs.developers.google.com/codelabs/firebase-android/#6

I needed to add a RecyclerView.AdapterDataObserver() :

mFirebaseAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
@Override
public void onItemRangeInserted(int positionStart, int itemCount) {
super.onItemRangeInserted(positionStart, itemCount);
int friendlyMessageCount = mFirebaseAdapter.getItemCount();
int lastVisiblePosition =
mLinearLayoutManager.findLastCompletelyVisibleItemPosition();
// If the recycler view is initially being loaded or the
// user is at the bottom of the list, scroll to the bottom
// of the list to show the newly added message.
if (lastVisiblePosition == -1 ||
(positionStart >= (friendlyMessageCount - 1) &&
lastVisiblePosition == (positionStart - 1))) {
mMessageRecyclerView.scrollToPosition(positionStart);
}
}
});

Problem solved!



Related Topics



Leave a reply



Submit