繁体   English   中英

Spinner.SetSelection(0)重置Xamarin.Android中的第二个Spinner

[英]Spinner.SetSelection(0) resets second Spinner in Xamarin.Android

我的问题是,我在Xamarin.Android中有2个微调框,需要根据选择的哪个进行重置。 假设我从Spinner1中选择了一些内容,然后必须使用Spinner.SetSelection(0)来重置Spinner2,反之亦然,以使它们默认返回0项。

这是理论上应该起作用但不起作用的代码。 发生的情况是,当其中任何一个Spinners都调用了ItemSelected时,两个Spinners都调用了SetSelected函数,并且都重置了它们,即使两个Spinners都有自己的Adapter,并调用了自己的函数/事件。

可能是什么问题?

码:

public Spinner spinner1;
public Spinner spinner2;

public void Init() {
    List<string> items = new List<string>();

    //Populate dta into Items for Adapter
    foreach(Data d in datas)
    {
        items.Add(d.ToString());
    }

    var adapter1 = new ArrayAdapter<string>(this, Resource.Layout.spinner_item, items);
    adapter1.SetDropDownViewResource(Resource.Layout.spinner_item);
    spinner1.Adapter = adapter;
    spinner1.ItemSelected += spinner1_ItemSelected;

    var adapter2 = new ArrayAdapter<string>(this, Resource.Layout.spinner_item, items);
    adapter2.SetDropDownViewResource(Resource.Layout.spinner_item);
    spinner2.Adapter = adapter;
    spinner2.ItemSelected += spinner2_ItemSelected;
}


public void spinner1_ItemSelected(object sender, AdapterView.ItemSelectedEventArgs e) {
    Spinner spinner = (Spinner)sender;
    string value = spinner.GetItemAtPosition(e.Position).ToString();
    //Use value ...

    //Reset spinner2
    spinner2.SetSelection(0);
}

public void spinner2_ItemSelected(object sender, AdapterView.ItemSelectedEventArgs e) {
    Spinner spinner = (Spinner)sender;
    string value = spinner.GetItemAtPosition(e.Position).ToString();
    //Use value ...

    //Reset spinner1
    spinner1.SetSelection(0);
}

您的代码是正确的,因为您的问题表明,当您更改第一个微调器时,第二个微调器重置时,您也已经为spinner1编写了重置代码,以便在第二个Spinner项中将其重置。 每当您更改微调器1的内容时,微调器2都会重置为第0个位置。 当那时spinner2重置到第0个位置时,将执行spinner2_ItemSelected,因此只有两者都被重置。

明确您的需求并相应地进行更改

public void spinner1_ItemSelected(object sender, AdapterView.ItemSelectedEventArgs e) {
    Spinner spinner = (Spinner)sender;
    string value = spinner.GetItemAtPosition(e.Position).ToString();
    //Use value ...

    //Reset spinner2
    spinner2.SetSelection(0);
}

public void spinner2_ItemSelected(object sender, AdapterView.ItemSelectedEventArgs e) {
    Spinner spinner = (Spinner)sender;
    string value = spinner.GetItemAtPosition(e.Position).ToString();
    //Use value ...

    //Reset spinner1
    //spinner1.SetSelection(0);
}

我找到了解决我问题的方法。 这可能是一个hack解决方案,但是由于没有人知道如何解决这个问题,因此现在必须这样做:

public Spinner spinner1;
public Spinner spinner2;

public enum Spinners {
    Spinner1, Spinner2, None
}

public Types SelectedSpinner;
public bool IsChangingSpinner;

public void Init() {
    SelectedSpinner = Spinners.None;
    IsChangingSpinner = false;

    List<string> items = new List<string>();

    //Populate dta into Items for Adapter
    foreach(Data d in datas)
    {
        items.Add(d.ToString());
    }

    var adapter1 = new ArrayAdapter<string>(this, Resource.Layout.spinner_item, items);
    adapter1.SetDropDownViewResource(Resource.Layout.spinner_item);
    spinner1.Adapter = adapter;
    spinner1.ItemSelected += spinner1_ItemSelected;

    var adapter2 = new ArrayAdapter<string>(this, Resource.Layout.spinner_item, items);
    adapter2.SetDropDownViewResource(Resource.Layout.spinner_item);
    spinner2.Adapter = adapter;
    spinner2.ItemSelected += spinner2_ItemSelected;
}


public void spinner1_ItemSelected(object sender, AdapterView.ItemSelectedEventArgs e) {
    if(IsChangingSpinner == false) {
        Spinner spinner = (Spinner)sender;
        string value = spinner.GetItemAtPosition(e.Position).ToString();
        //Use value ...

        //Reset spinner2
        IsChangingSpinner = true;
        spinner2.SetSelection(0);

        if(SelectedSpinner == Spinners.Spinner1) {
            IsChangingSpinner = false;
        }

        SelectedSpinner = Spinners.Spinner1;

    } else {
        IsChangingSpinner = false;
    }
}

public void spinner2_ItemSelected(object sender, AdapterView.ItemSelectedEventArgs e) {
    if(IsChangingSpinner == false) {
        Spinner spinner = (Spinner)sender;
        string value = spinner.GetItemAtPosition(e.Position).ToString();
        //Use value ...

        //Reset spinner1
        IsChangingSpinner = true;
        spinner1.SetSelection(0);

        if(SelectedSpinner == Spinners.Spinner2) {
            IsChangingSpinner = false;
        }

        SelectedSpinner = Spinners.Spinner2;
    } else {
        IsChangingSpinner = false;
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM