CategoryActivity class:
public class CategoryActivity extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener {
        RecyclerView recyclerView;
        List<Category> categoryList;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_category);
            Toolbar toolbar = findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);
            fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
            }
        });
        DrawerLayout drawer = findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.addDrawerListener(toggle);
        toggle.syncState();
        NavigationView navigationView = findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);
        recyclerView = findViewById(R.id.categoryRecyclerView);
        recyclerView.setHasFixedSize(true);
        RecyclerView.LayoutManager LM = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
        recyclerView.setLayoutManager(LM);
        categoryList = new ArrayList<>();
        FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
        final DatabaseReference databaseReference = firebaseDatabase.getReference("category");
        databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot data : dataSnapshot.getChildren()){
                    Category category = new Category((String) data.child("image").getValue(),(String) data.child("name").getValue(),data.getKey());
                    categoryList.add(category);
                }
                recyclerView.setAdapter(new CategoryAdapter(getBaseContext(), categoryList));
                for (Category cat : categoryList){
                    Log.i("name",cat.getCategoryName());
                   Log.i("id",cat.getCategoryId());
                }
            }
            @Override
            public void onCancelled(DatabaseError databaseError) {
            }
        });
    }
    @Override
    public void onBackPressed() {
        DrawerLayout drawer = findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }
    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();
        if (id == R.id.nav_category) {
            // Handle the camera action
        } else if (id == R.id.nav_cart) {
        } else if (id == R.id.nav_orders) {
        } else if (id == R.id.nav_logout) {
        }
        DrawerLayout drawer = findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }
}
CategoryAdapter class:
public class CategoryAdapter extends RecyclerView.Adapter<CategoryAdapter.CategoryViewHolder> {
    private Category category;
    private Context context;
    private List<Category> categoryList;
    CategoryAdapter(Context context, List<Category> categoryList) {
        this.context = context;
        this.categoryList = categoryList;
    }
    class CategoryViewHolder extends RecyclerView.ViewHolder {
        ImageView imageView;
        TextView textView;
        CategoryViewHolder(View itemView) {
            super(itemView);
            imageView = itemView.findViewById(R.id.category_image);
            textView = itemView.findViewById(R.id.category_name);
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    category = categoryList.get(getLayoutPosition());
                    Intent intent = new Intent(context,ProductActivity.class);
                    intent.putExtra("Category Id",category.getCategoryId());
                    intent.putExtra("Name",category.getCategoryName());
                    context.startActivity(intent);
                }
            });
        }
    }
    @Override
    public CategoryViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.category_list_item,parent,false);
        return new CategoryViewHolder(view);
    }
    @Override
    public void onBindViewHolder(CategoryViewHolder holder, int position) {
        category = categoryList.get(position);
        GlideApp.with(context).load(category.getImageUrl()).centerCrop().into(holder.imageView);
        holder.textView.setText(category.getCategoryName());
    }
    @Override
    public int getItemCount() {
        return categoryList.size();
    }
}
ProductActivity class:
public class ProductActivity extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener {
    private String categoryName;
    private String categoryId;
    List<Product> productList;
    RecyclerView recyclerView;
    Query query;
    FirebaseRecyclerOptions<List<Product>> options;
    FirebaseRecyclerAdapter<List<Product>,ProductViewHolder> adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_product);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        FloatingActionButton fab = findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
            }
        });
        DrawerLayout drawer = findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.addDrawerListener(toggle);
        toggle.syncState();
        NavigationView navigationView = findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);
        if (getIntent() != null) {
            categoryId = getIntent().getStringExtra("Category Id");
            categoryName = getIntent().getStringExtra("Name");
        }
        Toast.makeText(getBaseContext(),"id = " + categoryId +" and name = " + categoryName,Toast.LENGTH_LONG).show();
        productList = new ArrayList<>();
        recyclerView = findViewById(R.id.ProductRecyclerView);
        recyclerView.setHasFixedSize(true);
        RecyclerView.LayoutManager LM =  new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
        recyclerView.setLayoutManager(LM);
        query = FirebaseDatabase.getInstance().getReference().child("product");
        SnapshotParser<List<Product>> parser =  new SnapshotParser<List<Product>>() {
            @NonNull
            @Override
            public List<Product> parseSnapshot(@NonNull DataSnapshot snapshot) {
                Toast.makeText(getBaseContext(),"parse",Toast.LENGTH_LONG).show();
                if (!categoryId.isEmpty() && categoryId != null ){
                    for (DataSnapshot data : snapshot.getChildren()) {
                        if (data.child("categoryId").getValue() == categoryId) {
                            Product product = new Product((String) data.child("name").getValue(),
                            (String) data.child("description").getValue(), (String) data.child("image").getValue(),
                            (String) data.child("discount").getValue(), (String) data.child("price").getValue(),
                            (String) data.child("categoryId").getValue());
                            productList.add(product);
                            Toast.makeText(getBaseContext(), "productList", Toast.LENGTH_LONG).show();
                        }
                    }
                }
                return productList;
            }
        };
        options = new FirebaseRecyclerOptions.Builder<List<Product>>()
            .setQuery(query,parser).setLifecycleOwner(this).build();
        adapter = new FirebaseRecyclerAdapter<List<Product>, ProductViewHolder>(options) {
            @Override
            protected void onBindViewHolder(@NonNull ProductViewHolder holder, int position, @NonNull List<Product> model) {
                Toast.makeText(getBaseContext(),"onbind",Toast.LENGTH_LONG).show();
                Product product = model.get(position);
                GlideApp.with(getBaseContext()).load(product.getImage()).centerCrop().into(holder.imageView);
                holder.textView.setText(product.getName());
            }
            @Override
            public ProductViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                Toast.makeText(getBaseContext(),"oncreatholder",Toast.LENGTH_LONG).show();
                View view = LayoutInflater.from(getBaseContext()).inflate(R.layout.product_list_item,parent,false);
                return new ProductViewHolder(view);
            }
            @Override
            public void onDataChanged() {
                super.onDataChanged();
            }
        };
        recyclerView.setAdapter(adapter);
    }
    private class ProductViewHolder extends RecyclerView.ViewHolder {
        ImageView imageView;
        TextView textView;
        ProductViewHolder(View itemView) {
            super(itemView);
            imageView = itemView.findViewById(R.id.product_image);
            textView = itemView.findViewById(R.id.product_name);
        }
    }
    @Override
    public void onBackPressed() {
        DrawerLayout drawer = findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }
    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();
        if (id == R.id.nav_camera) {
            // Handle the camera action
        } else if (id == R.id.nav_gallery) {
        } else if (id == R.id.nav_slideshow) {
        } else if (id == R.id.nav_manage) {
        } else if (id == R.id.nav_share) {
        } else if (id == R.id.nav_send) {
        }
        DrawerLayout drawer = findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }
}
I used two type of adapters:
- The RecyclerView.Adapter in the CategoryActivity which is working well by retrieving the Categories from the Firebase 
- And the FirebaseRecyclerAdapter in the ProductActivity for retrieving the products from the Firebase where i get this error 
LogCat :
FATAL EXCEPTION: main
  Process: mcvals21.com.healthyjourney, PID: 25846
  java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
    at java.util.ArrayList.get(ArrayList.java:437)
    at mcvals21.com.healthyjourney.ProductActivity$3.onBindViewHolder(ProductActivity.java:134)
    at mcvals21.com.healthyjourney.ProductActivity$3.onBindViewHolder(ProductActivity.java:125)
    at com.firebase.ui.database.FirebaseRecyclerAdapter.onBindViewHolder(FirebaseRecyclerAdapter.java:122)
    at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6508)
    at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6541)
    at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5484)
    at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5750)
    at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5589)
    at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5585)
    at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2231)
    at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1558)
    at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1518)
    at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:610)
    at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3719)
    at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3436)
    at android.support.v7.widget.RecyclerView.consumePendingUpdateOperations(RecyclerView.java:1742)
    at android.support.v7.widget.RecyclerView$1.run(RecyclerView.java:354)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
    at android.view.Choreographer.doCallbacks(Choreographer.java:723)
    at android.view.Choreographer.doFrame(Choreographer.java:655)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
    at android.os.Handler.handleCallback(Handler.java:790)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6494)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
So is my implementation of FirebaseRecyclerAdapter in the ProductActivity right?
I used SnapshotParser to retrieve data from firebase to create the product list, so is that right or I have to use databaseReference.addValueEventListener to do that like in the categoryActivity?
And if I have to use databaseReference.addValueEventListener to retrieve the list from firebase, then what is the advantages of using FirebaseRecyclerAdapter instaed of RecyclerView.Adapter?
 
    