OnClickListener无法按预期工作

时间:2017-06-18 19:51:33

标签: java android android-spinner

我有一个带两个微调器的屏幕。第二个微调器中的选项取决于第一个微调器中的用户选择。

这是我的代码:

对于第一个微调器:

 ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(this,
                android.R.layout.simple_dropdown_item_1line, getResources().getStringArray(R.array.oman_states));

 final MaterialBetterSpinner materialDesignSpinner = (MaterialBetterSpinner)
                findViewById(R.id.states_list);       // states spinner

        materialDesignSpinner.setAdapter(arrayAdapter);

为第二个微调器:

  final MaterialBetterSpinner materialDesignSpinner2 = (MaterialBetterSpinner)
                findViewById(R.id.hospitals_list);

我在第二个微调器中实现了以下监听器:

materialDesignSpinner2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (materialDesignSpinner.getText().toString() == getString(R.string.muscat)) {

                    ArrayAdapter<String> muscatHospitals = new ArrayAdapter<>(v.getContext(),
                            android.R.layout.simple_dropdown_item_1line, getResources().getStringArray(R.array.muscat_hospitals));

                    materialDesignSpinner2.setAdapter(muscatHospitals);
                } else if (materialDesignSpinner.getText().toString() == getString(R.string.albatna)) {

                    ArrayAdapter<String> albatnaHospitals = new ArrayAdapter<>(v.getContext(),
                            android.R.layout.simple_dropdown_item_1line, getResources().getStringArray(R.array.albatan_hospitals));

                    materialDesignSpinner2.setAdapter(albatnaHospitals);

                } else if (materialDesignSpinner.getText().toString() == getString(R.string.musandam)) {

                    ArrayAdapter<String> smaelHospitals = new ArrayAdapter<>(v.getContext(),
                            android.R.layout.simple_dropdown_item_1line, getResources().getStringArray(R.array.musandam_hospitals));

                    materialDesignSpinner2.setAdapter(smaelHospitals);

                } else if (gm.spinnerChecking(materialDesignSpinner)) {
                    Toast.makeText(v.getContext(), getString(R.string.choose_state_first), Toast.LENGTH_LONG).show();
                }
                System.out.println("Working");
            }
        });

当我按下微调器时,应用程序崩溃

显示以下错误:

  

java.lang.NullPointerException:尝试调用虚方法'void   android.widget.Filter.filter(java.lang.CharSequence中,   在null对象引用上的android.widget.Filter $ FilterListener)'                                                                                 在   android.widget.AutoCompleteTextView.performFiltering(AutoCompleteTextView.java:971)                                                                                 在   com.weiwangcn.betterspinner.library.material.MaterialBetterSpinner.onFocusChanged(MaterialBetterSpinner.java:49)

如何根据第一个微调器选择第二个微调器?

更新

应用@dominicoder解决方案后,onItemSelected由于某种原因未执行,因为System.out.println()无法向控制台打印“工作”。

以下是onItemSelected的代码:

materialDesignSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                secondSpinnerAdapter.clear();
                secondSpinnerAdapter.addAll(getStringsForPosition(position));
                System.out.println("works");
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });

2 个答案:

答案 0 :(得分:1)

您不应该设置on click侦听器。而不是那样做

materialDesignSpinner2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {

    }
});

答案 1 :(得分:1)

有几件事:

  1. 使用Java中的== NOT 进行字符串比较。使用String.equals()
  2. 使用第一个微调器选择的位置来确定要显示的内容,而不是恰好在该位置显示的文本
  3. 您应该更新第二个微调器的状态以响应更改第一个微调器的状态,而不是检查第一个微调器状态何时显示第二个旋转器
  4. 您应该为您根据需要更新的第二个微调器创建一个适配器,而不是每次都创建一个新实例。
  5. 考虑到这些建议,我建议更像这样的事情:

    // Second adapter is a class field
    private ArrayAdapter<String> secondSpinnerAdapter;
    
    // Initialize it ONCE in onCreate with no items to begin with
    secondSpinnerAdapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_dropdown_item_1line);
    materialDesignSpinner2.setAdapter(secondSpinnerAdapter);
    
    // When something is selected in the first adapter,
    // update the options in the second adapter
    materialDesignSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            secondSpinnerAdapter.clear();
            secondSpinnerAdapter.addAll(getStringsForPosition(position));
        }
    
        @Override
        public void onNothingSelected(AdapterView<?> parent) {
    
        }
    });
    
    private String[] getStringsForPosition(int position) {
        switch(position) {
            case 0: return getResources().getStringArray(R.array.musandam_hospitals);
            // Add other cases
        }
    }
    

    这消除了字符串相等性检查,删除了重复,并且当第一个微调器中的某些内容被选中时产生意图&#34;更新第二个微调器中的选项&#34;更清楚。

    希望有所帮助!