2015-10-16 99 views
-1

我有9個具有相同功能的spinners,輸入值爲int數組。我無法通過'for'設置onItemSelectedListener在spinner數組中循環

因此,我用'for'Loop編寫代碼。我認爲這很有效。但它沒有奏效。

當我執行這個並檢查微調器時,int數組沒有改變。

如何使用'for'Loop將值輸入到int數組中?

//global 
int num; 

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
     android.R.layout.simple_spinner_item, items); 
spinner[] spinner; 
spinner = new Spinner[9]; 
int[] values; 
values = new int[9]; 

for(int i = 0; i < 9; i++){ 
    spinner[i] = new Spinner(this); 
    spinner[i] = (Spinner) findViewById(spinnerId[i]); 
    spinner[i].setAdapter(adapter); 
    values[i] = 0; 
}  

//OnItemSelectedListener 
for(int i = 0; i < 9; i++){ 
    num++; 
    spinner[i].setOnItemSelectedListener(new 
     AdapterView.OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> parent, 
       View view, int position, long id) { 
      values[num] = position; 
     } 

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

     } 
    }); 
} 
+0

這是因爲當onItemSelected方法所謂的num等於t 9.試着改變'values [num] = position;'To:'final int finalNum = num; values [finalNum] = position;' – RobVoisey

+0

不確定它的有效性,如果它不起作用,請告訴我,我將把它變成答案。如果沒有,您需要遍歷Spinner數組以找到已被按下的那個。 – RobVoisey

+0

你是否動態生成Spinner? –

回答

1

試試這個.. ..

1 activity_main.xml中

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <LinearLayout 
     android:id="@+id/spinner_container" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true" 
     android:orientation="vertical"/> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Dynamic Spinner" 
     android:id="@+id/textView3" 
     android:textColor="#000000" 
     android:textSize="18sp" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="64dp" /> 

</RelativeLayout> 

2.MainActivity.java

public class MainActivity extends AppCompatActivity { 

LinearLayout mContainer; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    GenerateView(); 
} 


private void GenerateView() { 

    mContainer = (LinearLayout)findViewById(R.id.spinner_container); 
    LinearLayout.LayoutParams mRowLayoutParams = new LinearLayout.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, 
      TableRow.LayoutParams.WRAP_CONTENT); 
    mRowLayoutParams.gravity = Gravity.CENTER_HORIZONTAL; 
    mRowLayoutParams.setMargins(8, 8, 8, 8); 

    String[] ITEMS = {"Item 1", "Item 2", "Item 3", "Item 4", "Item 5", "Item 6"}; 
    ArrayAdapter<String> adapter0 = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, ITEMS); 
    adapter0.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

    for (int i = 0; i < 9; i++) { 
     Spinner spinner = new Spinner(this); 
     spinner.setId(i); 
     spinner.setAdapter(adapter0); 
     spinner.setOnItemSelectedListener(mOnItemSelectedListener); 
     spinner.setLayoutParams(mRowLayoutParams); 
     mContainer.addView(spinner); 
    } 

} 

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

     Spinner spinner = (Spinner) parent; 

     switch (spinner.getId()) { 
      case 0: 
       shpwToast(spinner.getSelectedItem().toString()); 
       break; 
      case 1: 
       shpwToast(spinner.getSelectedItem().toString()); 
       break; 
      case 3: 
       shpwToast(spinner.getSelectedItem().toString()); 
       break; 
      case 4: 
       shpwToast(spinner.getSelectedItem().toString()); 
       break; 
      case 5: 
       shpwToast(spinner.getSelectedItem().toString()); 
       break; 
      case 6: 
       shpwToast(spinner.getSelectedItem().toString()); 
       break; 
      case 7: 
       shpwToast(spinner.getSelectedItem().toString()); 
       break; 
      case 8: 
       shpwToast(spinner.getSelectedItem().toString()); 
       break; 
      case 9: 
       shpwToast(spinner.getSelectedItem().toString()); 
       break; 
     } 
    } 

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

    } 
    }; 

    private void shpwToast(String content) { 
    Toast.makeText(MainActivity.this, "Item Selected : " + content, Toast.LENGTH_SHORT).show(); 
    } 

    } 

3.結果

Data Binding Implement OnItemSelectedListener

快樂編碼...

+0

我用你的答案解決了問題,謝謝! :-) bbb –

+0

@Johannes Lee請接受回答 –

+0

我是新手在這裏。我不知道接受答案,所以我遲到了接受答案。抱歉:-) –

0

這是不工作的原因

值[NUM] =位置;

當事件偵聽器觸發時,num值始終爲9。

您可以創建一個內部類實現監聽器接口,使用分配上構造一個指數varible,像這樣:

private class IndexedItemSelectedListener implements AdapterView.OnItemSelectedListener { 

    private final int index; 

    public IndexedItemSelectedListener(int index) { 
     this.index = index; 
    } 

    @Override 
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
     values[index] = position; 
    } 

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

    } 
} 

而且使用這樣的:

 //OnItemSelectedListener 
    for (int i = 0; i < spinner.length; i++) { 
     spinner[i].setOnItemSelectedListener(new IndexedItemSelectedListener(i)); 
    } 
+0

你教給我爲什麼'num'值總是設置爲9.非常感謝你:-) –