Not able to open a list of subcategory whenever user click on category item

24 Views Asked by At

i am trying to fetch subcategories whenever user click on category item, I am using recyclerview to call the category items and i am getting all the data from external database in the form of json.

1 Currently i have two different tabs in sidebar like category and subcategories both tabs load data separately.

json data example

Main category json data 

[
  {
    "id": 1,
    "category_name": "Maths",
    "q_count": 1,
    "category_image": "qcategory_Category test 1. dPy#NQHA7#PXwRG.png",
    "sub_categorys": 2
  },
  {
    "id": 2,
    "category_name": "General knowledge",
    "q_count": 2,
    "category_image": "qcategory_Category test 2.png",
    "sub_categorys": 2
  }
]

sub category json

[
  {
    "id": 6,
    "sub_category_name": "Arithmetic",
    "sub_category_image": "subcategory_Applenull",
    "category_id": 1,
    "question": 0
  },
  {
    "id": 7,
    "sub_category_name": "Geometry",
    "sub_category_image": "subcategory_Banananull",
    "category_id": 1,
    "question": 0
  },
  {
    "id": 8,
    "sub_category_name": "Gk Questions class 1",
    "sub_category_image": "subcategory_Carrotnull",
    "category_id": 2,
    "question": 0
  },
  {
    "id": 9,
    "sub_category_name": "Gk Questions class 2",
    "sub_category_image": "subcategory_Radishnull",
    "category_id": 2,
    "question": 0
  }
]

Data madel code

Main category

`public class Quiz_Category implements Serializable {
    
    //public Long id;
    public Long id;
    public String category_name;
    public String category_image;
    public String q_count;
    public String question;
    
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
    public String getCategory_image() {
        return category_image;
    }

    public void setCategory_image(String category_image) {
        this.category_image = category_image;
    }
    public List<QuestionsPojo> question_list = new ArrayList<>();
}`

Subcategories data

`
public int id;
    public String sub_category_name;
    public String sub_category_image;
    public Long category_id;
    public String question;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
    public String getSub_Category_image() {
        return sub_category_image;
    }

    public void setSub_Category_image(String sub_category_image) {
        this.sub_category_image = sub_category_image;
    }

`

my category adptor

   public ViewHolder(View v) {
            super(v);
            category_name = (TextView) v.findViewById(R.id.txtcustomrow);
            bellow_name = (TextView) v.findViewById(R.id.q_count);
            category_image = (ImageView) v.findViewById(R.id.img);
            lyt_parent = (CardView) v.findViewById(R.id.Ripple_layout);
        }
    }

    public Filter getFilter() {
        return mFilter;
    }
    // Provide a suitable constructor (depends on the kind of dataset)
    public QuizAdapter(Context ctx, List<Quiz_Category> items) {
        this.ctx = ctx;
        original_items = items;
        filtered_items = items;
        categorylist = items;
        ctx.getTheme().resolveAttribute(R.attr.selectableItemBackground, mTypedValue, true);
        mBackground = mTypedValue.resourceId;
    }

    @Override
    public QuizAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.quiz_list, parent, false);
        v.setBackgroundResource(mBackground);
        ViewHolder vh = new ViewHolder(v);
        return vh;
    }

    // Replace the contents of a view (invoked by the layout manager)
    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder,final int position) {
        
        final Quiz_Category p = filtered_items.get(position);
        
        //final Quiz_Category p = categorylist.get(position);
        holder.category_name.setText(p.category_name);
        imgloader.displayImage(Constant.getURLimgQuizCategory(p.category_image), holder.category_image);
        
        holder.bellow_name.setText(p.question);
        String url = DataManager.catphotourl+ categorylist.get(position).category_image;
        try {
            url = URLDecoder.decode(url, "UTF-8");
            url = url.replaceAll(" ", "%20");
        } catch (UnsupportedEncodingException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        //holder.category_image.setImage(url);
        
        holder.lyt_parent.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent i = new Intent(ctx, ActivitySubCategoryDetails.class);
                    i.putExtra(ActivitySubCategoryDetails.EXTRA_OBJCT, p);
                    ctx.startActivity(i);
                }
            });
        
        
    }

    // Return the size of your dataset (invoked by the layout manager)
    @Override
    public int getItemCount() {
        return categorylist != null ? categorylist.size() : 0;
        //return filtered_items.size();
    }

    @Override
    public long getItemId(int position) {
        return filtered_items.get(position).id;
    }
    
    private class ItemFilter extends Filter {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            String query = constraint.toString().toLowerCase();
            FilterResults results = new FilterResults();
            final List<Quiz_Category> list = original_items;
            final List<Quiz_Category> result_list = new ArrayList<>(list.size());
            for (int i = 0; i < list.size(); i++) {
                String str_title = list.get(i).category_name;
                if (str_title.toLowerCase().contains(query)) {
                    result_list.add(list.get(i));
                }
            }
            results.values = result_list;
            results.count = result_list.size();
            return results;
        }

currently i am using FilterResults to filter subcategories.

Category loader

public class QuizListLoader extends AsyncTask<String, String, List<Quiz_Category>> {
    String URL = Constant.getURLquizcategory();
    private Gson gson = new Gson();

    public interface TaskListener {
        public void onFinished(List<Quiz_Category> result);
    }

    // This is the reference to the associated listener
    private final TaskListener taskListener;

    public QuizListLoader(TaskListener listener) {
        this.taskListener = listener;
    }

    @Override
    protected List<Quiz_Category> doInBackground(String... params) {
        ArrayList<Quiz_Category> list = new ArrayList<Quiz_Category>();
        Quiz_Category[] f = null;
        try {
            URL url = new URL(URL);
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            Gson gson = new Gson();

            JsonReader reader = new JsonReader(new InputStreamReader(con.getInputStream()));
            f = gson.fromJson(reader, Quiz_Category[].class);

            for (Quiz_Category flower : f) {
                list.add(flower);
            }

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return list;
    }

    @Override
    protected void onPostExecute(List<Quiz_Category> result) {
        super.onPostExecute(result);
        // In onPostExecute we check if the listener is valid
        if (this.taskListener != null) {
            this.taskListener.onFinished(result);
        }
    }

Sub category loader

public class SubCat_List_Loader extends AsyncTask<String, String, List<SubCategory>> {
    String URL = Constant.getURLsubcategory();
    private Gson gson = new Gson();

    public interface TaskListener {
        public void onFinished(List<SubCategory> result);
    }

    // This is the reference to the associated listener
    private final TaskListener taskListener;

    public SubCat_List_Loader(TaskListener listener) {
        this.taskListener = listener;
    }

    @Override
    protected List<SubCategory> doInBackground(String... params) {
        ArrayList<SubCategory> list = new ArrayList<SubCategory>();
        SubCategory[] f = null;
        try {
            URL url = new URL(URL);
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            Gson gson = new Gson();

            JsonReader reader = new JsonReader(new InputStreamReader(con.getInputStream()));
            f = gson.fromJson(reader, SubCategory[].class);

            for (SubCategory flower : f) {
                list.add(flower);
            }

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return list;
    }

    @Override
    protected void onPostExecute(List<SubCategory> result) {
        super.onPostExecute(result);
        // In onPostExecute we check if the listener is valid
        if (this.taskListener != null) {
            this.taskListener.onFinished(result);
        }
    }

i am trying to open subcategories in seprate recyclerview whenever user click on category. All subcategories have there own category_id.

thankyou.

0

There are 0 best solutions below