2013-02-11 68 views
1

我有一個微調器,有幾個值,我從我的web服務填充它。Mono for Android:Spinner ItemSelected事件觸發負載,但不應該?

灌裝微調

int i = 0; 

var dropItems = new List<SpinItem2>(); 

DataRow[] result = myOPTvalues.Tables[0].Select("FieldValue=" + item.FieldValue); 
foreach (DataRow row in result) 
{ 
    var optItem = new PrevzemSpin(); 
    optItem.FieldValue = row["FieldValue"].ToString(); 
    if (optItem.FieldValue.Equals("")) 
    optItem.FieldValue = null; 

    optItem.FieldTextValue = row["FieldTextValue"].ToString(); 
    if (optItem.FieldTextValue.Equals("")) 
    optItem.FieldTextValue = null; 

    dropItems.Add(new SpinItem2(i, optItem.FieldValue.ToString(), optItem.FieldTextValue.ToString())); 
      } 

i = 1; 
foreach (DataRow row in myOPTvalues.Tables[0].Rows) 
{ 
    var optItem = new PrevzemSpin(); 
    optItem.FieldValue = row["FieldValue"].ToString(); 
    if (optItem.FieldValue.Equals("")) 
    optItem.FieldValue = null; 

    optItem.FieldTextValue = row["FieldTextValue"].ToString(); 
    if (optItem.FieldTextValue.Equals("")) 
    optItem.FieldTextValue = null; 


    if (optItem.FieldValue != item.FieldValue) 
    { 
     dropItems.Add(new SpinItem2(i, optItem.FieldValue.ToString(), optItem.FieldTextValue.ToString())); 
    } 
    ++i; 
} 

出於某種原因,它的作用就像是被插入第一是在默認的「選擇」的項目,然後觸發,我用它來發送所選不過我還是要說的ItemSelected事件我不想那樣。

由於我的屏幕上有相當數量的這些旋鈕,它確實減慢了活動速度,並且它還將不正確的值發送到字段,並且由於我使用ItemSelect來檢測一切是否正常(假設服務下降或在用戶完成表單等時服務器上的值本身發生了變化(有人在服務器應用程序中添加了一個新字段)等等)

有沒有辦法告訴應用程序不要在活動負載上觸發該功能,而是在實際的用戶交互中觸發該功能?

+1

在Android中,默認情況下,spinner的第一項被選中,並在加載時執行onItemSelected(...)中的代碼。所以,保羅的答案應該做的工作。我自己在我的一個項目及其工作中實現了這一點。 – Braj 2013-02-11 08:41:07

回答

1

之前,我宣佈GetView:

int LastSpinnerSelectedPosition; 

在我的微調定義:

LastSpinnerSelectedPosition = 0; 

我的微調ItemSelected事件:

var CurrentSelectedIndex = SpinnerValue.SelectedItemPosition; 

if (CurrentSelectedIndex != LastSpinnerSelectedPosition) 
{ 
    // WHATEVER I WANTED TO DO ON ITEM SELECT ANYWAY 

    // Fix the LastSpinnerSelectedPosition ;) 
    LastSpinnerSelectedPosition = CurrentSelectedIndex; 
} 

簡單; d

+1

是的,那樣做。對於獎勵徽章,您可以接受您自己的答案! – Paolo 2013-02-12 08:36:35

+0

我知道:)但我必須等待一天:) – 2013-02-12 10:29:58

4

我不能專門爲Android發言,但我已經在Windows上遇到過這麼多次。

我通常使用的解決方案是簡單地添加布爾值loading變量。在初始化開始時將其設置爲true,然後在最後清除它。

在您的事件處理程序如ItemSelected中,您可以簡單地檢查是否由於初始加載而觸發了這種情況。

private void onItemSelected(....) 
{ 
    if(loading) 
    { 
     return; //Ignore as form is still loading 
    } 

    //Normal event handling logic goes here 
    .... 
} 
+0

我會如何正確清除它? – 2013-02-11 09:12:36

+1

只需在初始化方法結束時設置'loading = false'即可。 – Paolo 2013-02-11 09:16:33

+0

http://pastebin.com/54N0HFEx哪裏在這個代碼會是? 提示 -//如果字段是ComboBOX是我的微調代碼駐留的地方。 – 2013-02-11 09:21:56

1

只是爲了進行說明,選擇某個項目時會觸發事件。語義顯然是有缺陷的,但從技術上說,當它最初被加載時,它被選中,因爲然後你可以立即向微調控制器詢問選擇了哪個項目,所以其他答案說,只是忽略它第一次被選中,因爲它保證是加載選擇,然後在正常之後繼續。

+0

是的,我讀過這個話題。我理解微調器工作原理背後的基本邏輯,但是它缺少讓我們說「OnUserItemSelect」/「OnUserItemTouch」的方法,所以我們可以避免在微調器每次進入時都做出解決方法:) – 2013-02-12 10:28:45