web-dev-qa-db-ja.com

Android Spinner-onItemSelected / setOnItemSelectedListenerがトリガーされない

これは私が以前にやったことですが、なぜそれが現在機能していないのか理解できないため、私を夢中にさせています...

メニューボタンがあり、通常の方法でmenu.xmlファイルと、スピナーを作成して表示するスイッチを含むonOptionsItemSelectedメソッド。

setOnItemSelectedListenerを追加しましたが、トリガーされないようです。スピナーが表示されます。オプションを選択するか、バックアウトします。onItemSelectedonNothingSelectedも呼び出されません。

これは、メニューボタン処理switchステートメントの「case」と「return true」の間のすべてのコードです。 (topThisはアクティビティのコンテキストを参照する変数です-アプリ内の他のすべてのトーストに対して正常に動作します)

String[] widgetModes = {"Mode 1", "Mode2"};
ArrayAdapter<String> widgetModeAdapter = new ArrayAdapter<String> (this, Android.R.layout.simple_spinner_item, widgetModes);
widgetModeAdapter.setDropDownViewResource(Android.R.layout.simple_spinner_dropdown_item);

Spinner widgetModeSpinner = new Spinner(this);
widgetModeSpinner.setAdapter(widgetModeAdapter);
widgetModeSpinner.setPrompt("Choose Widget Mode");

widgetModeSpinner.setOnItemSelectedListener(new OnItemSelectedListener() 
{
    @Override
    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) 
    {
        Toast.makeText(topThis, "derp", Toast.LENGTH_LONG).show();
    }

    @Override
    public void onNothingSelected(AdapterView<?> parentView) 
    {
        Toast.makeText(topThis, "herf", Toast.LENGTH_LONG).show();
    }
});

widgetModeSpinner.performClick();

何か案は?私はSpinnerをプログラムで作成しているという事実が問題だと漠然と疑っています...

18
Greg

スピナーを実装していたときに同様の問題が発生しました。親ビューを取得し、Adapter-

spinner1 =(Spinner)findViewById(R.id.spinner1);
spinner1.setAdapter(BindSpinner("ProgramMaster",cols,null,true,""));
spinner1.setOnItemSelectedListener(new OnItemSelectedListener() 
{
protected Adapter initializedAdapter=null;
    @Override
    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) 
    {
        if(initializedAdapter !=parentView.getAdapter() ) {
            initializedAdapter = parentView.getAdapter();
           return;
        }

        String selected = parentView.getItemAtPosition(position).toString();

        if(abc.equals("Select") && !selected.equals("Select"))
        {
            do something
        }

        else 
        {
            Do something
        }
        textQualification=selected;
        SearchUpdated("Qualification");
    }

    @Override
    public void onNothingSelected(AdapterView<?> parentView) {
        // your code here
    }
});
14
JNI_OnLoad

同じスピナーアイテムを再選択することはできません。スピナーの選択を処理するカスタムコードを追加しない場合は、常に最初のアイテムが選択済みとして設定されます。

Toastが表示されないため、次のようなリスナーインターフェイス内でToastを作成するときは、常にコンテキストとして「MyActivity.this」を使用することをお勧めします。

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        /**
         * Called when a new item is selected (in the Spinner)
         */
         public void onItemSelected(AdapterView<?> parent, View view, 
                    int pos, long id) {
                // An spinnerItem was selected. You can retrieve the selected item using
                // parent.getItemAtPosition(pos)

                Toast.makeText(MyActivity.this, "Hello Toast",Toast.LENGTH_SHORT).show();

            }

            public void onNothingSelected(AdapterView<?> parent) {
                // Do nothing, just another required interface callback
            }

    }); // (optional)

そして、最後の。show()は時々忘れがちです;)

6
TouchBoarder

実際、スピナーの可視性がgoneに設定されている場合、performclick()メソッドを呼び出すとクリックがトリガーされますが、setOnItemSelectedListenerはトリガーされませんしたがって、可視性を変更する必要があります

5
Mehroz Munir

質問は少し古いことはわかっていますが、AsyncTaskコールバックを待っている場合は、コールバックスレッドでnotifyDataSetChanged()を呼び出して、アダプターにデータの変更を知らせてください。

@Override
public void onPostExecute(String result) {
   ///do something with your data  
   spinnerArrayAdapter.notifyDataSetChanged();
}
2
Nostradamus