Spinner.SetSelection(0)重置Xamarin.Android

时间:2017-09-23 10:39:07

标签: c# android .net xamarin spinner

我的问题是我在Xamarin.Android中有2个Spinners需要根据选择的那个重置彼此。假设我从Spinner1中选择了一些东西,然后Spinner2必须被重置,反之亦然,Spinner.SetSelection(0),以便它们默认返回0项。

这是理论上应该起作用但不起作用的代码。当其中任何一个具有ItemSelected时,两个Spinners都会调用它们的SetSelected函数并且两个都被重置,甚至两个Spinners都有自己的适配器,并且有自己的函数/事件来调用。

可能是什么问题?

代码:

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);
}

2 个答案:

答案 0 :(得分:0)

您的代码是正确的,因为您的问题是,当您更改第一个微调器第二个微调器重置时,您还为spinner1编写了重置代码,以在微调器中重置它两个itemSelected。每当您更改微调器1内容微调器时,两个都会重置为第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);
}

答案 1 :(得分:0)

我为我的问题找到了解决方案。这可能是一个黑客解决方案,但由于没有人能够弄清楚如何解决这个问题,现在必须要做的是:

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;
    }

}