每当用户单击类别项时,都无法打开子类别列表

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

提问人:user8663248 提问时间:10/12/2023 最后编辑:user8663248 更新时间:10/14/2023 访问量:20

问:

每当用户单击类别项目时,我都会尝试获取子类别,我正在使用 recyclerview 调用类别项目,并且我以 json 的形式从外部数据库获取所有数据。

1 目前,我在侧边栏中有两个不同的选项卡,如类别和子类别,这两个选项卡分别加载数据。

JSON 数据示例

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
  }
]

数据编码

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;
    }

`

我的类别 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;
        }

目前我正在使用 FilterResults 来过滤子类别。

类别加载器

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);
        }
    }

子类别加载器

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);
        }
    }

每当用户单击类别时,我都会尝试在 Seprate RecyclerView 中打开子类别。所有子类别都有自己的category_id。

谢谢。

java android-recyclerview android-listview 嵌套RecyclerView

评论


答: 暂无答案