Reputation: 200
I'm following a tutorial from less than 3 months ago, so I'm assuming it can't be outdated already. I'm using a FirebaseRecyclerAdapter
in my Android project. Currently I'm trying to search books stored in my Firebase
and return a matching Book, in my searchBook
method I'm using a FirebaseRecyclerAdapter
. However when I declare my FirebaseRecyclerAdapter = new Firebas...
I'm being forced to implemented two methods, onBindviewHolder
and onCreateViewHolder
. I don't think I need these, or if I do, can someone explain to me why I might?
Currently this is my code:
private void searchBook(){
FirebaseRecyclerAdapter<Book, BookViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Book, BookViewHolder>(
Book.class,
R.layout.listview_booksearchresults,
BookViewHolder.class,
bookDatabase
) {
protected void populateViewHolder(BookViewHolder viewHolder, Book model, int position){
viewHolder.setDetails(model.getTitle(), model.getAuthor(), model.getImageURL());
}
};
mResultList.setAdapter(firebaseRecyclerAdapter);
}
And if I click to implement these two methods, my code becomes error ridden like there's no tomorrow.
Code after implementing methods:
private void searchBook(){
FirebaseRecyclerAdapter<Book, BookViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Book, BookViewHolder>(
Book.class,
R.layout.listview_booksearchresults,
BookViewHolder.class,
bookDatabase
) {
@NonNull
@Override
public BookViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return null;
}
@Override
protected void onBindViewHolder(@NonNull BookViewHolder holder, int position, @NonNull Book model) {
}
protected void populateViewHolder(BookViewHolder viewHolder, Book model, int position){
viewHolder.setDetails(model.getTitle(), model.getAuthor(), model.getImageURL());
}
};
mResultList.setAdapter(firebaseRecyclerAdapter);
}
This is my first time using a RecyclerAdapter
so I'm very new to the concept. Hoping this is just a rookie error!
Where am I going wrong and why?
This is my updated onCreate method:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(activity_searchbook);
bookDatabase = FirebaseDatabase.getInstance().getReference("All_Books");
searchField = (EditText) findViewById(R.id.book_Title);
search = (Button) findViewById(R.id.searchBookButton);
mResultList = (RecyclerView) findViewById(R.id.result_List);
mResultList.setHasFixedSize(true);
mResultList.setLayoutManager(new LinearLayoutManager(this));
DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("All_Books");
Query query = ref.orderByChild("title").equalTo(searchField.toString());
FirebaseRecyclerOptions<Book> options =
new FirebaseRecyclerOptions.Builder<Book>()
.setQuery(query, Book.class)
.build();
FirebaseRecyclerAdapter adapter = new FirebaseRecyclerAdapter<Book, BookViewHolder>(options) {
@Override
public BookViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// Create a new instance of the ViewHolder, in this case we are using a custom
// layout called R.layout.message for each item
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.listview_booksearchresults, parent, false);
return new BookViewHolder(view);
}
@Override
protected void onBindViewHolder(BookViewHolder holder, int position, Book model) {
holder.setDetails(model.getTitle(), model.getAuthor(), model.getImageURL());
}
};
mResultList.setAdapter(adapter);
}
Upvotes: 1
Views: 494
Reputation: 80914
You are using the newest Firebaseui version, there is no populateViewHolder
anymore, you need to do the following:
First, configure the adapter by building FirebaseRecyclerOptions
. Book
is your POJO class and then query will be the data that should be shown in the recyclerview.
DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("users");
Query query=ref.orderByChild("name").equalTo(name);
FirebaseRecyclerOptions<Book> options =
new FirebaseRecyclerOptions.Builder<Book>()
.setQuery(query, Book.class)
.build();
Then create the FirebaseRecyclerAdapter
object:
FirebaseRecyclerAdapter adapter = new FirebaseRecyclerAdapter<Book, BookViewHolder>(options) {
@Override
public BookViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// Create a new instance of the ViewHolder, in this case we are using a custom
// layout called R.layout.message for each item
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.message, parent, false);
return new BookViewHolder(view);
}
@Override
protected void onBindViewHolder(BookViewHolder holder, int position, Book model) {
// Bind the Book object to the BookViewHolder
// ...
}
};
more info here:
Upvotes: 1