我的问题是我在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);
}
答案 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;
}
}