簡體   English   中英

OnClickListener無法正常工作

[英]OnClickListener doesn't work as expected

我有一個屏幕,上面有兩個微調器。 第二個微調器中的選擇取決於第一個微調器中的用戶選擇。

這是我的代碼:

對於第一個微調器:

 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:嘗試在android.widget.AutoCompleteTextView.performFiltering()上的空對象引用上調用虛擬方法'void android.widget.Filter.filter(java.lang.CharSequence,android.widget.Filter $ FilterListener)' 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) {

            }
        });

您不應該設置點擊監聽器。 而不是這樣做

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

    }

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

    }
});

有兩件事:

  1. 不做使用字符串比較==在Java中。 使用String.equals()
  2. 使用第一個微調器的選擇位置確定要顯示的內容,而不是恰好在該位置顯示的文本
  3. 您應該更新第二個微調器的狀態以響應第一個微調器的狀態變化,而不是在第二個微調器中顯示某些內容時檢查第一個微調器的狀態
  4. 您應該只為第二個微調器創建一個適配器,然后根據需要進行更新,而不是每次都創建一個新實例。

考慮到這些建議,我會建議更多類似的內容:

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

這樣就消除了字符串相等性檢查,消除了重復,並使“當選擇了第一個微調器中的某項時,更新了第二個微調器中的選項”的意圖變得更加清晰。

希望有幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM