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?