简体   繁体   English

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

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

My issue is that I have 2 Spinners in Xamarin.Android that needs to reset each other depending on which one is selected. 我的问题是,我在Xamarin.Android中有2个微调框,需要根据选择的哪个进行重置。 Say I select something from Spinner1, then Spinner2 has to be reset and vice-versa, with Spinner.SetSelection(0) so that they defaults back to the 0 item. 假设我从Spinner1中选择了一些内容,然后必须使用Spinner.SetSelection(0)来重置Spinner2,反之亦然,以使它们默认返回0项。

Here's the code which in theory should work, but doesn't. 这是理论上应该起作用但不起作用的代码。 What happens is when either one of them has an ItemSelected, both of the Spinners gets their SetSelected function called and both are reset, even tho both Spinners have their own Adapter, with their own function/event to call. 发生的情况是,当其中任何一个Spinners都调用了ItemSelected时,两个Spinners都调用了SetSelected函数,并且都重置了它们,即使两个Spinners都有自己的Adapter,并调用了自己的函数/事件。

What could be the issue? 可能是什么问题?

Code: 码:

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

Your code is correct as your issue says that, when you change the first spinner second spinner resets also you have written the reset code for spinner1 to reset it in the spinner two itemSelected. 您的代码是正确的,因为您的问题表明,当您更改第一个微调器时,第二个微调器重置时,您也已经为spinner1编写了重置代码,以便在第二个Spinner项中将其重置。 Whenever you change the spinner 1 content spinner two gets resetted to 0 th position. 每当您更改微调器1的内容时,微调器2都会重置为第0个位置。 When spinner2 resetted to 0 th position at that time spinner2_ItemSelected will execute, so only both get reset. 当那时spinner2重置到第0个位置时,将执行spinner2_ItemSelected,因此只有两者都被重置。

Be clear with your need and change accordingly 明确您的需求并相应地进行更改

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

I found a solution for a my issue. 我找到了解决我问题的方法。 It's probably a hack solution, but since none could figure out how to solve this, this has to do for now: 这可能是一个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