Basically I want to create a parent recyclerView which shows the categories and the child recyclerView shows the books of that specific category. But the result of my code is giving me the same books for all categories. Below is the necessary code attached.
Java Source Code for home fragment adapter call
private void loadCategories() {
//init arrayList
categoryArrayList = new ArrayList<>();
//get all categories from firebase
DatabaseReference ref = FirebaseDatabase.getInstance().getReference("Categories");
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
//clear arrayList before adding data to it
categoryArrayList.clear();
for (DataSnapshot ds : snapshot.getChildren()) {
//get data
ModelCategory model = ds.getValue(ModelCategory.class);
//add category to arrayList
categoryArrayList.add(model);
}
//setup adapter
adapterCategoryHome = new AdapterCategoryHome(categoryArrayList);
//set adapter to recyclerView
binding.categoryRv.setAdapter(adapterCategoryHome);
adapterCategoryHome.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
Parent Adapter
public class AdapterCategoryHome extends RecyclerView.Adapter<AdapterCategoryHome.HolderCategory> {
private Context context;
public ArrayList<ModelCategory> categoryArrayList;
public static final String TAG = "CATEGORY_HOME_TAG";
//arrayList to hold data of type ModelPdf
private ArrayList<ModelPdf> pdfArrayList;
private AdapterPdfHome adapterPdfHome;
public AdapterCategoryHome(ArrayList<ModelCategory> categoryArrayList) {
this.categoryArrayList = categoryArrayList;
}
@NonNull
@Override
public HolderCategory onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//bind view of row_category_home.xml
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_category_home, parent, false);
this.context = parent.getContext();
return new HolderCategory(view);
}
@Override
public void onBindViewHolder(@NonNull AdapterCategoryHome.HolderCategory holder, int position) {
//get data
ModelCategory model = categoryArrayList.get(position);
String id = model.getId();
String category = model.getCategory();
String uid = model.getUid();
long timestamp = model.getTimestamp();
Log.d(TAG, "onBindViewHolder: "+category);
//set data
holder.categoryTv.setText(category);
loadPdfList(model, holder);
}
private void loadPdfList(ModelCategory model, HolderCategory holder) {
//init list before adding data
pdfArrayList = new ArrayList<>();
DatabaseReference ref = FirebaseDatabase.getInstance().getReference("Books");
ref.orderByChild("categoryId").equalTo(model.getId())
.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
pdfArrayList.clear();
for (DataSnapshot ds : snapshot.getChildren()) {
//get data
ModelPdf model = ds.getValue(ModelPdf.class);
//add to list
pdfArrayList.add(model);
}
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(context,LinearLayoutManager.HORIZONTAL,false);
holder.bookRv.setHasFixedSize(true);
Log.d(TAG, "pdf size: " + pdfArrayList.size() + model.getCategory() + holder.categoryTv.getText()+ holder.categoryTv.getContext());
//setup adapter
adapterPdfHome = new AdapterPdfHome(holder.bookRv.getContext(), pdfArrayList);
holder.bookRv.setLayoutManager(layoutManager);
holder.bookRv.setAdapter(adapterPdfHome);
adapterPdfHome.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
@Override
public int getItemCount() {
return categoryArrayList.size();
}
/*View Holder class to hold UI views for row_category.xml*/
class HolderCategory extends RecyclerView.ViewHolder {
//ui views of row_category.xml
TextView categoryTv;
RecyclerView bookRv;
public HolderCategory(@NonNull View itemView) {
super(itemView);
//init ui views
categoryTv = itemView.findViewById(R.id.categoryTv);
bookRv = itemView.findViewById(R.id.bookRv);
}
}
}
Child Adapter
public class AdapterPdfHome extends RecyclerView.Adapter<AdapterPdfHome.HolderPdfAdmin> {
//context
private Context context;
//arrayList to hold list of data of type modelPdf
public ArrayList<ModelPdf> pdfArrayList;
private FilterPdfAdmin filter;
private static final String TAG = "PDF_ADAPTER_TAG";
//progress dialog
private ProgressDialog progressDialog;
//constructor of above
public AdapterPdfHome(Context context, ArrayList<ModelPdf> pdfArrayList) {
this.context = context;
this.pdfArrayList = pdfArrayList;
Log.d(TAG, "AdapterPdfHome: "+pdfArrayList.size());
//init progress dialog
progressDialog = new ProgressDialog(context);
progressDialog.setTitle("Please Wait");
progressDialog.setCanceledOnTouchOutside(false);
}
@NonNull
@Override
public HolderPdfAdmin onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//bind view of row_pdf_admin.xml
View view = LayoutInflater.from(context).inflate(R.layout.row_pdf_home,parent,false);
return new HolderPdfAdmin(view);
}
@Override
public void onBindViewHolder(@NonNull AdapterPdfHome.HolderPdfAdmin holder, int position) {
/*Get data, Set Data, handle clicks, etc.*/
//get data
ModelPdf model = pdfArrayList.get(position);
String title = model.getTitle();
String author = model.getAuthor();
Log.d(TAG, "onBindViewHolder: "+title);
//set data
holder.titleTv.setText(title);
holder.authorTv.setText(author);
Glide.with(context)
.load(model.getCoverPageUrl())
.placeholder(R.drawable.back01)
.into(holder.pdfIv);
}
@Override
public int getItemCount() {
//return size of arrayList
return pdfArrayList.size();
}
/*view holder class for row_pdf_user.xml*/
class HolderPdfAdmin extends RecyclerView.ViewHolder {
//UI views of row_pdf_admin.xml
TextView titleTv, authorTv;
ImageView pdfIv;
public HolderPdfAdmin(@NonNull View itemView) {
super(itemView);
//init ui views
titleTv = itemView.findViewById(R.id.titleTv);
authorTv = itemView.findViewById(R.id.authorTv);
pdfIv = itemView.findViewById(R.id.pdfIv);
}
}
}