0

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?

André Kool
  • 4,880
  • 12
  • 34
  • 44
McVaLs21
  • 3
  • 4
  • Possible duplicate of [What causes a java.lang.ArrayIndexOutOfBoundsException and how do I prevent it?](https://stackoverflow.com/questions/5554734/what-causes-a-java-lang-arrayindexoutofboundsexception-and-how-do-i-prevent-it) – AskNilesh Mar 07 '18 at 11:23
  • Please reduce this question to [the minimum](https://stackoverflow.com/help/mcve). Right now there is way to much code to go through. – André Kool Mar 07 '18 at 12:35
  • sorry for that guys...i rewrite the question again to make it clear...so please help me or tell me if there is anything missing...thanks – McVaLs21 Mar 07 '18 at 16:03

0 Answers0