0

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);
        }
    }
}
  • If you encounter problems, it's best to create a [MCVE](https://stackoverflow.com/help/mcve) when posting a question. You posted almost **500 (five hundred)** lines of code for this issue. That's a lot for people to parse and try to debug online. Please edit your question and isolate the problem, in that way you increase your chances of being helped. – Alex Mamo Mar 11 '22 at 07:07
  • @AlexMamo I have tried to isolate the problem as short as possible please check. – Soumajit Roy_33 Mar 11 '22 at 17:26

1 Answers1

0

move "private AdapterPdfHome adapterPdfHome;" to "onBindViewHolder"

DFrenzy
  • 1
  • 1
  • Your answer could be improved with additional supporting information. Please [edit] to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers [in the help center](/help/how-to-answer). – Community Dec 13 '22 at 17:26