Eoghan Casey
Eoghan Casey

Reputation: 200

FirebaseRecyclerAdapter forcing me to implement methods that I don't want/need

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

Answers (1)

Peter Haddad
Peter Haddad

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:

https://github.com/firebase/FirebaseUI-Android/tree/master/database#using-firebaseui-to-populate-a-recyclerview

Upvotes: 1

Related Questions