mardi 19 janvier 2021

how to get selected/unselected data inside a fragment where checkbox inside an adapter within an adapter?

app screenshots

I have a product detail which contains some list of variation and inside of variations I have another list of variation options.

"product": {
            "id": 1,
            "name": "Rangs 2 Ton Inverter AC",
            "price": 99900,
            "variations": [
                {
                    "id": 2,
                    "title": "Color",
                    "required": true,
                    "selection_type": 2,
                    "options": [
                        {
                            "id": 5,
                            "name": "White",
                            "price": 100,
                            "price_type": 1
                        },
                        {
                            "id": 6,
                            "name": "Black",
                            "price": 500,
                            "price_type": 1
                        },
                        {
                            "id": 7,
                            "name": "Red",
                            "price": 50,
                            "price_type": 1
                        },
                        {
                            "id": 8,
                            "name": "Cream",
                            "price": 0,
                            "price_type": 1
                        }
                    ]
                },
                {
                    "id": 3,
                    "title": "size",
                    "required": true,
                    "selection_type": 1,
                    "options": [
                        {
                            "id": 9,
                            "name": "2",
                            "price": 1000,
                            "price_type": 1
                        },
                        {
                            "id": 10,
                            "name": "5",
                            "price": 10000,
                            "price_type": 1
                        },
                        {
                            "id": 11,
                            "name": "10",
                            "price": 15000,
                            "price_type": 1
                        }
                    ]
                },
                {
                    "id": 4,
                    "title": "Box",
                    "required": true,
                    "selection_type": 1,
                    "options": [
                        {
                            "id": 12,
                            "name": "below 50 kg",
                            "price": 10,
                            "price_type": 2
                        },
                        {
                            "id": 13,
                            "name": "over 50 kg",
                            "price": 15,
                            "price_type": 2
                        }
                    ]
                }
            ]
        }

My model class

public class Variation {
    private int id;
    private String title;
    private boolean isRequired;
    private int type;
    private ArrayList<VariationOption> variationOptionArrayList;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public boolean isRequired() {
        return isRequired;
    }

    public void setRequired(boolean required) {
        isRequired = required;
    }

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    public ArrayList<VariationOption> getVariationOptionArrayList() {
        return variationOptionArrayList;
    }

    public void setVariationOptionArrayList(ArrayList<VariationOption> variationOptionArrayList) {
        this.variationOptionArrayList = variationOptionArrayList;
    }

    @Override
    public String toString() {
        return "Variation{" +
                "id=" + id +
                ", title='" + title + '\'' +
                ", isRequired=" + isRequired +
                ", type=" + type +
                ", variationsOptionArrayList=" + variationOptionArrayList +
                '}';
    }
}

My other model class

public class VariationOption {
    private int id;
    private String name;
    private double price;
    private int priceType;
    private boolean isChecked;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public int getPriceType() {
        return priceType;
    }

    public void setPriceType(int priceType) {
        this.priceType = priceType;
    }

    public boolean isChecked() {
        return isChecked;
    }

    public void setChecked(boolean checked) {
        isChecked = checked;
    }
}

variation options are checkboxes. My goal is to set the data and get the selected variation options inside the fragment.

What I have tried

I used two adapters to represent data inside UI.

The first adapter for variation contains another recycler view and another adapter for variation options.

Variation list adapter

public class ProductVariationListAdapter extends RecyclerView.Adapter<ProductVariationListAdapter.ViewHolder> {

    private Context context;
    private ArrayList<Variation> variationArrayList;

    public ProductVariationListAdapter(Context context, ArrayList<Variation> variationArrayList) {
        this.context = context;
        this.variationArrayList = variationArrayList;
    }

    @NonNull
    @Override
    public ProductVariationListAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_each_row_product_variation, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ProductVariationListAdapter.ViewHolder holder, int position) {
        Variation variation = variationArrayList.get(position);
        holder.labelProductVariationTitle.setText(variation.getTitle());
        if (variation.isRequired()) {
            holder.labelProductVariationRequired.setVisibility(View.VISIBLE);
        } else {
            holder.labelProductVariationRequired.setVisibility(View.GONE);
        }

        LinearLayoutManager layoutManager = new LinearLayoutManager(context);
        holder.recyclerViewProductVariationOption.setLayoutManager(layoutManager);
        holder.recyclerViewProductVariationOption.setHasFixedSize(true);
        holder.recyclerViewProductVariationOption.setNestedScrollingEnabled(false);
        ProductVariationOptionListAdapter adapter = new ProductVariationOptionListAdapter(context, variation.getVariationOptionArrayList());
        holder.recyclerViewProductVariationOption.setAdapter(adapter);
    }

    @Override
    public int getItemCount() {
        return variationArrayList.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        private TextView labelProductVariationTitle;
        private TextView labelProductVariationRequired;
        private RecyclerView recyclerViewProductVariationOption;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            labelProductVariationTitle = itemView.findViewById(R.id.labelProductVariationTitle);
            labelProductVariationRequired = itemView.findViewById(R.id.labelProductVariationRequired);
            recyclerViewProductVariationOption = itemView.findViewById(R.id.recyclerViewProductVariationOption);
        }
    }
}

variation option list adapter

public class ProductVariationOptionListAdapter extends RecyclerView.Adapter<ProductVariationOptionListAdapter.ViewHolder> {

    private Context context;
    private ArrayList<VariationOption> variationOptionArrayList;

    public ProductVariationOptionListAdapter(Context context, ArrayList<VariationOption> variationOptionArrayList) {
        this.context = context;
        this.variationOptionArrayList = variationOptionArrayList;
    }

    @NonNull
    @Override
    public ProductVariationOptionListAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_each_row_product_variations_option, parent, false);
        return new ProductVariationOptionListAdapter.ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ProductVariationOptionListAdapter.ViewHolder holder, int position) {
        VariationOption variationOption = variationOptionArrayList.get(position);
        holder.tvOptionPricing.setText(variationOption.getPrice() + " " + context.getResources().getString(R.string.bdt));
        holder.checkBoxOption.setText(variationOption.getName());

        if (variationOption.isChecked()) {
            holder.checkBoxOption.setChecked(true);
        } else {
            holder.checkBoxOption.setChecked(false);
        }

    }

    @Override
    public int getItemCount() {
        return variationOptionArrayList.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        private final CheckBox checkBoxOption;
        private final TextView tvOptionPricing;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            checkBoxOption = itemView.findViewById(R.id.checkBoxOption);
            tvOptionPricing = itemView.findViewById(R.id.tvOptionPricing);

            //checkbox click event handling
            checkBoxOption.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    if (isChecked) {
                        Toast.makeText(context, "selected " + checkBoxOption.getText(), Toast.LENGTH_LONG).show();
                    } else {
                        Toast.makeText(context, "unselected " + checkBoxOption.getText(), Toast.LENGTH_LONG).show();
                    }
                }
            });
        }
    }

so how can I achieve selected and unselected listener inside fragment or how can I achieve this feature?




Aucun commentaire:

Enregistrer un commentaire