2012-03-20 17 views
9

選択した項目によって別のスピナーからスピナーを更新しようとしています。次のコードブロックは、私がどのようにしたのかを示しています。別のスピナーの選択項目に基づいてスピナー項目を更新します。

ontainemSelected()メソッド内のifステートメントを使用して、spinner3を正常に更新できました。しかし、私の問題は、ループがちょうど "自動的に値" 5 "を選択しているようだということです。spinner2(Toastは"あなたが5を選択しました ")。

アクティビティが読み込まれると、Toastは3つのスピナーのそれぞれの選択を表示します。アダプターがスピナーに設定されているときに、各スピナーの最初の選択が行われることを意味しますか?

また、adapter3をspinner3にバインドすると(if文で)、spinner2の新しい選択がトリガーされますか?

ありがとうございます!

public class WheelchairHelperMain extends Activity{ 

Spinner spinner2; 
Spinner spinner3; 
ArrayAdapter<CharSequence> adapter3 ; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.wheelchair_helper_main); 

    Spinner spinner1 = (Spinner)findViewById(R.id.spinner1); 
    ArrayAdapter<CharSequence> adapter1 = ArrayAdapter.createFromResource(this, R.array.destinations_list, android.R.layout.simple_spinner_item); 
    adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    spinner1.setAdapter(adapter1); 
    spinner1.setOnItemSelectedListener(new MyOnItemSelectedListener()); 

    spinner2 = (Spinner)findViewById(R.id.spinner2); 
    ArrayAdapter<CharSequence> adapter2 = ArrayAdapter.createFromResource(this,R.array.departure_timeH_list,android.R.layout.simple_spinner_item); 
    adapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    spinner2.setAdapter(adapter2); 
    spinner2.setOnItemSelectedListener(new MyOnItemSelectedListener()); 

    spinner3 = (Spinner)findViewById(R.id.spinner3); 
    spinner3.setOnItemSelectedListener(new MyOnItemSelectedListener()); 



} 

public class MyOnItemSelectedListener implements OnItemSelectedListener{ 


    public void onItemSelected(AdapterView<?> parent, View v, int pos,long id) { 
     // TODO Auto-generated method stub 
     //use the selected station and departure time to calculate the required time 
      Toast toast = Toast.makeText(parent.getContext(),"You've chosen: " + parent.getItemAtPosition(pos), 2); 
      toast.show(); 

      if (spinner2.getSelectedItem().equals("5")){ 
       adapter3 = ArrayAdapter.createFromResource(WheelchairHelperMain.this,R.array.departure_timeH5M_list, android.R.layout.simple_spinner_item); 
       adapter3.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
       spinner3.setAdapter(adapter3); 

      Log.v("spinner2","5"); 
      }else if(spinner2.getSelectedItem().equals("6")){ 

       adapter3 = ArrayAdapter.createFromResource(WheelchairHelperMain.this,R.array.departure_timeH6M_list, android.R.layout.simple_spinner_item); 
       adapter3.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
       spinner3.setAdapter(adapter3); 

       Log.v("spinner2","6"); 
      } 

    } 



    public void onNothingSelected(AdapterView<?> arg0) { 
     // TODO Auto-generated method stub 

    } 

} 
} 

以下はxmlファイルです。 これはspinner2のための文字列の配列である:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
<string name="departure_timeH_prompt">何時?</string> 
<string-array name="departure_timeH_list"> 
    <item>5</item> 
    <item>6</item> 
    <item> 7 </item> 
    <item> 8 </item> 
    <item> 9 </item> 
    <item> 10 </item> 
    <item> 11 </item> 
    <item> 12 </item> 
    <item> 13 </item> 
    <item> 14 </item> 
    <item> 15 </item> 
    <item> 16 </item> 
    <item> 17 </item> 
    <item> 18 </item> 
    <item> 19 </item> 
    <item> 20 </item> 
    <item> 21 </item> 
    <item> 22 </item> 
    <item> 23 </item> 
    <item> 24 </item> 
    <item> 0 </item>  
    </string-array> 
</resources> 

spinner3ための文字列の配列:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
<string name="departure_timeM_prompt">何分?</string> 
<string-array name="departure_timeH5M_list"> 
    <item> 5 </item> 
    <item> 24 </item> 
    <item> 38 </item> 
    <item> 52 </item> 
</string-array> 
<string-array name="departure_timeH6M_list"> 
    <item> 01 </item> 
    <item> 08 </item> 
    <item> 17 </item> 
    <item> 25 </item> 
    <item> 34 </item> 
    <item> 41 </item> 
    <item> 47 </item> 
    <item> 57 </item> 
</string-array> 
</resources> 

私はちょうど私の問題を発見しました。元のコードで

spinner3.setAdapter(adapter3); 

onItemSelectedListener内部と呼ばれています。アダプタをAdapterViewに設定すると、アダプタの最初の項目が自動的に1回選択されます。したがって、リスナーが再びトリガーされます。

そして、選択肢がspinner2から来ているかどうかを区別するフラグを設定していないので、spinner3.setAdapter(adapter3)を入れても、「選択された項目が5であるかどうかをチェックする」ということになります。

ので、元のコードでは、次のフラグを挿入することは私の作品:

if (parent.getId()==2131165201){ 
    //code to check selected item and define new adapter3 for spinner3 

答えて

0

スピナーの変更は次のスピナーのアダプター内のデータを置くとき。そしてちょうどadapter.notifyDataSetChanged();を書いてください。次のスピナーの内容が変わります。

`

String hrs[]=getStringArray(R.array.departure_timeH6M_list); 
    if(hrs[pos].equals("5")) 
    { 

    } 

`

---のようにして:

+0

お役に立てば幸いですか私は最初に新しい文字列配列(XMLファイル)をアダプタにバインドし、notifyDataSetChanged()を呼び出すことでこれを試しました。しかし、何も起こらなかった。データの変更はプログラムで行う必要がありますか? – Bao

2

私はuがonItemclickListenerによって返された位置を使用し、そのスピナーのためのアレイアダプタを初期化する配列にそれを使用することをお勧めそう...

+0

あなたの助けてくれてありがとう、私は私の問題がどこにあるのか分かった! – Bao

0

私はあなたの質問を正しく理解していれば、スピナーはデフォルトで値を選択しています。最初に値を選択します。そのデフォルト選択をクリアするには、onItemselectedListenerに単純なハックを書く必要があります。 1つのint変数= -1を取る私のコードで 私のコードでは デフォルトの選択を見つけるために選択された1つのブール値の年齢を取る。 (選択された場合)は、ユーザーが選択したスピナーを意味します。

最後にageSpinner.setOnItemSelectedListener(new MyOnItemSelectedListener());を使用します。

class MyOnItemSelectedListener implements OnItemSelectedListener { 

     public void onItemSelected(AdapterView<?> parent, 
      View view, int pos, long id) { 
      if(ageposition==-1) 
      { 
       ageselected=false; 
       ageposition=pos; 
      } 
      else 
      { 
       ageposition=pos; 
       ageselected=true; 
       childage=age[pos]; 
      } 


     } 
     public void onNothingSelected(AdapterView<?> parent) { 
      // Dummy 
     } 
    } 

は、上記のコードは、あなたがそれを達成する方法の上でより詳しく説明していただけますか?

+0

'ageposition'の値はどこから来るのか分かりません。もっと詳しく教えていただけますか?それを行う方法があれば、デフォルトの選択を解除すると便利かもしれないと思います。 – Bao

+0

我々はそれsetAdapter使用もデフォルト値は、この値はarrayadapter.Ifに使用される配列の最初の項目であろう選択される任意の値を選択せず​​に、スピナーのために表示されますが「0」の位置の値を設定するonitemselectedコール。この小さなハックのために、私はint変数のエージングを最初から取っています。最初は-1になります。この変数が-1の場合、デフォルトではsetAdapterを使ってOnitemselectedが呼び出されます。この条件を使用して、それが-1でない場合は、スピナーを選択しています。 – Manju

関連する問題