Home > Back-end >  Loading Text and Image from FireBase Database to a View Holder
Loading Text and Image from FireBase Database to a View Holder

Time:01-14

Need To Get the Text & Image From FireBase Database And View them Using FireBase RecyclerAdapter But the Problem is:

  • There is a red line Under FirebaseRecyclerAdapter<Category, MenuViewHolder>which said

Class 'Anonymous class derived from FirebaseRecyclerAdapter' must either be declared abstract or implement abstract method 'onBindViewHolder(VH, int, T)' in 'FirebaseRecyclerAdapter'

  • populateViewHolder I write it manully I think this method is depreciated.

Click to See a Picture Which Shows the Problems

private void loadMenu() {
    FirebaseRecyclerAdapter<Category,MenuViewHolder> adapter = new FirebaseRecyclerAdapter<Category, MenuViewHolder> (Category.class , R.layout.menu_item , MenuViewHolder.class , category){
        @Override
        protected void populateViewHolder(@NonNull MenuViewHolder viewHolder, Category model, int position) {
            viewHolder.txtMenuName.setText(model.getName());
            Picasso.get().load(model.getImage()).into(viewHolder.ImageView);
            Category clickItem = model;
            viewHolder.setItemClickListener(new ItemClickListener() {
                @Override
                public void onClick(View view, int position, boolean isLongClick) {
                    Toast.makeText(Home.this, ""   clickItem.getName(), Toast.LENGTH_SHORT).show();

                }
            });
        }

        @NonNull
        @Override
        public MenuViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            return null;
 

       }
        };
        recycler_menu.setAdapter(adapter);
}

Thanks A Lot

CodePudding user response:

You should override onBindViewHolder so it can call populateViewHolder. try something like this:

 @Override
public void onBindViewHolder(VH viewHolder, int position) {
    Category model = getItem(position);
    populateViewHolder(viewHolder, model, position);
}

Also, I believe that in onCreateViewHolder you should inflate your item layout and return a new ViewHolder.

CodePudding user response:

To use the adapter's from FirebaseUI, you need to override them and implement both onCreateViewHolder and onBindViewHolder. There is no need for a populateViewHolder method though.

From the FirebaseUI documentation on Using the FirebaseRecyclerAdapter comes this minimal example:

FirebaseRecyclerAdapter adapter = new FirebaseRecyclerAdapter<Chat, ChatHolder>(options) {
    @Override
    public ChatHolder 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 ChatHolder(view);
    }

    @Override
    protected void onBindViewHolder(ChatHolder holder, int position, Chat model) {
        // Bind the Chat object to the ChatHolder
        // ...
    }
};

Most of the code you have in populateViewHolder now, will end up in onBindViewHolder when using FirebaseUI.

  •  Tags:  
  • Related