【问题标题】:How do I uncheck checkbox upon new spinner value?如何取消选中新微调器值的复选框?
【发布时间】:2017-07-26 18:57:54
【问题描述】:

假设 vocSpinner value = "Combat/Service" 和 popSpinner value = "NSmen" 我检查 cb1。它会给出一个清单。但是,当我将 popSpinner 更改为“Regular/NSF”时,它会更改为另一个列表(这是正确的),但是如何在不创建另一个覆盖的数据的情况下取消选中该复选框。我提供的代码似乎不起作用,我无法解决。欢迎所有帮助,提前致谢!

imgur.com/a/1wt4N [应用截图]

private String[] vocSpinner;
private String[] popSpinner;

private List<Standard> standardList = new ArrayList<>();
private RecyclerView recyclerView;
private StandardsAdapter sAdapter;
private CheckBox cb1;
private CheckBox cb2;

cb1 = (CheckBox) getActivity().findViewById(R.id.pushUp);
cb2 = (CheckBox) getActivity().findViewById(R.id.sitUp);

this.vocSpinner = new String[]{
            "CDO/Diver/Gds/Fitness Spec", "Combat/Service"
    };

this.popSpinner = new String[]{
            "NSmen", "Regular/NSF", "Pre-enlistee"
    };

final Spinner v = (Spinner) getActivity().findViewById(R.id.spinner_Voc);
final Spinner p = (Spinner) getActivity().findViewById(R.id.spinner_PopGp);

ArrayAdapter<String> adapterV = new ArrayAdapter<String>(getActivity(),
            android.R.layout.simple_spinner_item, vocSpinner);
    v.setAdapter(adapterV);

ArrayAdapter<String> adapterP = new ArrayAdapter<String>(getActivity(),
            android.R.layout.simple_spinner_item, popSpinner);
    p.setAdapter(adapterP);

v.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
            standardList.clear();
            cb1.setEnabled(true);
            cb2.setEnabled(true);
            switch (position) {
                case 0:
                    if (p.getSelectedItem().equals("NSmen")) {
                        cb1.setChecked(false);
                        cb2.setChecked(false);
                        addStandardToList("Gold - $500", ">89pts");
                        addStandardToList("Silver - $300", ">74pts");
                        addStandardToList("Incentive - $200", ">60pts");
                        addStandardToList("Pass", ">50pts");
                        sAdapter.notifyDataSetChanged();} 
                    else if (p.getSelectedItem().equals("Regular/NSF")) {
                        cb1.setChecked(false);
                        cb2.setChecked(false);
                        addStandardToList("Gold - $300", ">89pts");
                        addStandardToList("Silver - $200", ">74pts");
                        addStandardToList("Incentive", "NA");
                        addStandardToList("Pass", ">60pts");
                        sAdapter.notifyDataSetChanged();

【问题讨论】:

  • 那么您需要选择任何其他微调器值,默认情况下您的文本框应处于未选中状态?如果是的话,假设您的列表被复选框过滤,您的列表应该显示什么值。列表是否应该有复选框选中或未选中的值?
  • 是的。该列表应显示未选中复选框的值。当我取消选中复选框时是否也可以这样做,它会返回到未选中的复选框值而不是显示选中的复选框值
  • 所以在你的微调器的 onItemSelected 监听器中你已经完成了 cb1.setEnabled(true); cb2.setEnabled(true);在此之下,您还应该执行 cb1.setChecked(false); cb2.setChecked(false);
  • 为这两个微调器 onItemSelect 方法做它
  • 太好了,解决了!

标签: android checkbox android-recyclerview


【解决方案1】:

在你的微调器的 onItemSelected 监听器中你已经完成了

cb1.setEnabled(true); 
cb2.setEnabled(true); 

下面你也应该这样做

cb1.setChecked(false); 
cb2.setChecked(false); 

如果没有选中复选框,它会手动选择与之前选择的微调器相同的值,以便调用微调器的选择侦听器并根据微调器值重新填充数组。为此,请在您的 else 中执行以下操作 -

String getSelectedItemP = p.getSelectedItem().toString();
                    p.setSelection(((ArrayAdapter<String>)p.getAdapter()).getPosition(getSelectedItemP));
                    String getSelectedItemV = v.getSelectedItem().toString();
                    v.setSelection(((ArrayAdapter<String>)p.getAdapter()).getPosition(getSelectedItemV));

所以你的 if 条件 onCheckedChanged 看起来像

 if (v.getSelectedItem().equals("CDO/Diver/Gds/Fitness Spec") || v.getSelectedItem().equals("Combat/Service") && p.getSelectedItem().equals("NSmen")) {
                if (cb1.isChecked() && cb2.isChecked()) {
                    addStandardToList("Gold - $500", "NA");
                    addStandardToList("Silver - $300", "NA");
                    addStandardToList("Incentive - $200", "NA");
                    addStandardToList("Pass", ">25pts");
                    sAdapter.notifyDataSetChanged();
                } else if (cb1.isChecked() || cb2.isChecked()) {
                    addStandardToList("Gold - $500", "NA");
                addStandardToList("Silver - $300", "NA");
                addStandardToList("Incentive - $200", "NA");
                addStandardToList("Pass", ">38pts");
                sAdapter.notifyDataSetChanged();
                }else{
                    // select spinner again here manually.
                    String getSelectedItemP = p.getSelectedItem().toString();
                    p.setSelection(((ArrayAdapter<String>)p.getAdapter()).getPosition(getSelectedItemP));
                    String getSelectedItemV = v.getSelectedItem().toString();
                    v.setSelection(((ArrayAdapter<String>)p.getAdapter()).getPosition(getSelectedItemV));
                }
            }

【讨论】:

  • 我已经实现了确切的代码,但它仍然无法按预期工作。
  • 那么当没有选择任何内容时它不会改变值还是显示错误的值?
  • 所以之前,仅在 cb1 侦听器上,我必须先检查 cb2,然后再检查 cb1 以获得(Pass >25pts)列表。所以我尝试对 cb2 监听器实现相同的逻辑,现在它按预期工作。只是整体代码会有点混乱。
  • 好了,一切就绪,按预期工作!我再次最诚挚的感谢 kapsym :)
  • 很抱歉再次打扰您,但我发现了 2 个错误,并且已经在我的代码中玩了半个小时,但还没有发现任何问题。所以基本上,在启动应用程序时,我检查 cb1 或 cb2 并将 vocSpinner 更改为下一个值,它将显示两个列表,如 URL 中所示。 imgur.com/a/T0TBI
【解决方案2】:

从以下代码中获取cb:

View myView = list.getChildAt(index);
CheckBox checkItem = (CheckBox) myView.findViewById(R.id.checkboxId);
checkItem.setChecked(false);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    相关资源
    最近更新 更多