Mono for Android:Spinner ItemSelected事件在加载时触发,但不应该?

时间:2013-02-11 08:05:51

标签: android events triggers xamarin.android spinner

我有一个带有一些值的微调器,我从我的网络服务中填充它。

填充微调器

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来检测一切是否正常(假设服务掉线或者服务器上的值本身已更改(有人在服务器应用程序上添加了一个新字段),而用户正在填写表单等。)

是否有人告诉应用程序不要在活动加载时触发,而是在实际用户交互上?

3 个答案:

答案 0 :(得分:4)

我无法专门为Android发言,但我在Windows上遇到过很多次。

我通常使用的解决方案是简单地添加一个布尔loading变量。在初始化开始时将其设置为true,然后在结束时将其清除。

ItemSelected之类的事件处理程序中,您只需检查是否因初始加载而触发此操作。

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

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

答案 1 :(得分: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

答案 2 :(得分:1)

只是为了澄清,选择项目时会触发事件。语义显然是有缺陷的,但从技术上讲,项目在最初加载时被选中,因为你可以立即询问微调器选择哪个项目,所以其他答案说,只要忽略它第一次被选中,因为它保证是加载选择,然后在此之后正常进行。