2009-09-27 73 views
42

我在Spinner的setSelection上遇到了一些問題。當代碼中顯示微調器時,我將該值設置爲預選,但它不起作用,列表中的第一個替代項始終處於選中狀態。代碼如下所示:Android:setSelection對Spinner沒有任何影響

LayoutInflater li = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    final View dialogView = li.inflate(R.layout.edit_event, null); 
    ... 
    ArrayList<String> routes = new ArrayList<String>(); 
    // routes filled with values at runtime 
    ... 
    ArrayAdapter<String> aa = new ArrayAdapter<String>(GOFdroid.this, android.R.layout.simple_spinner_item, routes); 
    aa.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

    Spinner destSpinner = (Spinner) dialogView.findViewById(R.id.edit_event_destination); 

    String dest = events.get(pos).getDestination(); 
    int routesPos = routes.indexOf(dest); 
    Log.d(TAG, "Dest: " + dest + ", pos: " + routesPos); 
    destSpinner.setSelection(routesPos); 

    destSpinner.setAdapter(aa); 

的代碼按預期工作除了爲setSelection部分,我只是想不通爲什麼。

微調的XML佈局看起來是這樣的(不是整個佈局,只是微調部分):

// DESTINATION 
<TextView 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="Destination:" /> 
<Spinner 
    android:id="@+id/edit_event_destination" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:prompt="@string/choose_dest" 
    android:layout_marginBottom="10dip" 
    android:text="" /> 

幫助非常感謝!

萊納斯

回答

89

嘗試調用setAdapter()之後移動調用setSelection()

+2

太容易了! ;)感謝commonsware,再次爲我節省了一些時間! – aspartame 2009-09-27 21:39:19

+0

令人驚歎!解決了我的問題! – user712051 2012-05-22 15:57:06

+0

謝謝,在那裏爲我節省了幾分鐘;) – 2013-09-10 12:39:11

59

我有類似的問題。在我的情況下,setAdapersetSelection的順序是正確的!執行表格onCreate工作,但從onResume執行時沒有效果。

solution是致電setSelection(my_pos, true)。注意第二個參數。

+6

謝謝!我永遠不會想象一個名爲'animate'的參數會產生這種效果... – Timores 2011-10-12 20:29:53

+0

謝謝!我從來沒有嘗試過 - 浪費了那麼多時間...... – 2011-11-11 15:46:22

+0

非常感謝!我不會那樣做的。在找到你的帖子之前,我花了兩個小時。 – Paul 2012-02-16 19:24:53

17

在我的情況沒有答案的工作,所以我通過處理程序

new Handler().postDelayed(new Runnable() {   
    public void run() { 
     mSpinner.setSelection(1); 
    } 
    }, 100); 

做上速度較慢的設備上運行時,這可能會導致問題排隊爲setSelection,但我正在爲一個特定的設備所以它的可以使用這個黑客

+0

+1,這解決了我的情況下,只有以前的不。我在Android 2.3.3的onCreate()方法,設置適配器 – 2012-11-16 21:04:33

+0

+ 1後,我發現這是讓它在OnItemSelectedListener中工作的唯一方法。 – cdavidyoung 2012-11-23 05:27:14

+1

謝謝,因爲沒有其他工作......但它給我一個壞感覺 – Steff 2016-07-20 18:24:46

1

解決的辦法是調用setSelection(my_pos,true)。注意第二個參數。

唐`忘了,如果你調用動畫,設置佈局PARAMS然後:) 舉例:需要手動reseted

1

LinearLayout.LayoutParams spinnerLp = (LinearLayout.LayoutParams) spinner.getLayoutParams(); 
spinner.setSelection(selectedPositionAge, true); 
spinnerLp.gravity = Gravity.CENTER; 
spinner.setLayoutParams(spinnerLp); 

手動設置好的墊襯,以微調在fragment : setSelection內的微調器的相同問題在活動的第一次啓動時onCreate期間正常工作,但在旋轉屏幕時沒有發生。我通過在片段的onViewStateRestored方法內調用setSelection來解決它,而不是在onCreate方法中調用它。我不確定,但我認爲在視圖完全加載之前您不能使用setSelection,即使您可以使用findViewById它。

+0

這是我的情況下的解決方案。基本上,在'onCreate'不是第一個,視圖狀態然後由系統恢復。那裏的setSelection會被狀態恢復機制恢復。解決方案是在狀態恢復發生後運行'setSelection' – entropy 2014-07-07 14:24:35

+0

這看起來很有前途,但是當我在'onViewStateRestored()'方法內調用'Spinner mySpinner =(Spinner)getView()。findViewById(R.id.mySpinner)它返回null(當我在'onCreate()'中調用它時它不返回null)。 – 2015-08-02 16:50:41

27

你可以嘗試

mSpinner.post(new Runnable() {   
    public void run() { 
     mSpinner.setSelection(1); 
    } 
    }); 

這將發佈可運行操作的視圖創建了以上的回答

+2

毫不遲疑地更好,它似乎也起作用。 – Joqn 2013-11-07 11:25:57

+0

很好的答案,謝謝 – 2017-06-05 11:35:33

1

沒有工作對我來說,就立即執行。但是,工作的是在我的片段的onCreateView()方法中創建實例變量mSpinner(或者我期望的是,您的活動的'onCreate()'方法),然後在我的onLoadFinished()方法中執行此操作...

@Override 
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { 

    adapter.swapCursor(cursor); 
    mSpinner.setSelection(mSelectedIndex); 

} 
0

試試這個,它的工作對我來說:

Spinner destSpinner = (Spinner)dialogView.findViewById(R.id.edit_event_destination); 
destSpinner.setSelection(0); 
String dest = events.get(pos).getDestination(); 
int routesPos = routes.indexOf(dest); 
destSpinner.setAdapter(aa); 
Log.d(TAG, "Dest: " + dest + ", pos: " + routesPos); 
destSpinner.setSelection(routesPos); 
1

Spinner.setSelection()如果你以前Spinner.setAdapter()

調用它不工作嘗試調用setAdapter後調用setSelection()()。

故此背後:當你的適配器設置爲前調用Spinner.Selection()只是意味着你正在試圖通過爲setSelection()來設置微調器,以自定義索引時,它不包含任何數據,或者我們可以說,這就是微調有最大的項目= 0。

so setSelection(1)表示對於max item = 0的微調器,將索引設置爲1;雖然微調自己處理這個outBoundIndex,所以你的應用程序不會崩潰。

呼叫SetSelection()應setAdapter後()只

此外,如果有一個Spinner.SetOnItemSelectedListener()和你有問題,即onItemSelected(AdapterView<?> parent, View view, int position, long id)被tiggered與位置值= 0時的活性負載和則應使用這種模式。

Spinner.SetAdapter() 
Spinner.setSelection(); 
Spinner.setOnItemSelectedListener(); 
0

使用本

sp2.setAdapter(sp2.getAdapter()); 
    sp2.getAdapter().notifyDataSetChanged(); 
    sp2.setSelection(0, false); 
相關問題