【问题标题】:how to get selected/unselected data inside a fragment where checkbox inside an adapter within an adapter?如何在适配器内的适配器内的复选框内的片段内获取选定/未选择的数据?
【发布时间】:2021-01-19 18:08:38
【问题描述】:

app screenshots

我有一个产品详细信息,其中包含一些变体列表和变体内部我还有另一个变体选项列表。

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

我的模型课

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

我的其他模型类

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

变体选项是复选框。我的目标是设置数据并在片段中获取选定的变体选项。

我的尝试

我在 UI 中使用了两个适配器来表示数据。

第一个变体适配器包含另一个回收器视图和另一个变体选项适配器。

变体列表适配器

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

变体选项列表适配器

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

那么我怎样才能在片段中实现选中和未选中的监听器,或者我怎样才能实现这个功能?

【问题讨论】:

  • 你应该把你的截图从链接中拿出来放在实际的问题中。
  • @GenoC 我没有足够的声望上传问题内的图片

标签: java android checkbox android-recyclerview android-checkbox


【解决方案1】:

首先在您的采用者内部声明接口:

interface SelectedListener(){

   public void getCheckbox(int position)

}

SelectedListener selectedListener;

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

现在调用接口方法到你的onBindViewHolder:

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

最后在你的片段中调用适配器并实现 getCheckbox 方法。

【讨论】:

    猜你喜欢
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多