Android 微调器 onselect AsyncTask
Android spinner onselect AsyncTask
我有 2 个微调器元素,如果用户更改任何微调器的 selection,我想启动一个异步任务 仅。
问题是,当我在我的设备上启动 activity 时,两个异步任务都会立即启动,即使用户没有 select 任何东西。
我尝试了什么:
final Spinner sp1 = findViewById(R.id.spinner1);
final Spinner sp2 = findViewById(R.id.spinner2);
final List<String> list = new ArrayList<String>();
list.add(getString(R.string.text1));
list.add(getString(R.string.text2));
list.add(getString(R.string.text3));
final List<String> list2 = new ArrayList<String>();
list2.add(getString(R.string.item1));
list2.add(getString(R.string.item2));
list2.add(getString(R.string.item3));
ArrayAdapter<String> adp1 = new ArrayAdapter<String>(this,
R.layout.spinner_item, list);
adp1.setDropDownViewResource(R.layout.my_spinnerlist);
sp1.setAdapter(adp1);
sp1.setSelection(((ArrayAdapter)sp1.getAdapter()).getPosition(default1));
ArrayAdapter<String> adp2 = new ArrayAdapter<String>(this,
R.layout.spinner_item, list2);
adp2.setDropDownViewResource(R.layout.my_spinnerlist);
sp2.setAdapter(adp2);
sp2.setSelection(((ArrayAdapter)sp2.getAdapter()).getPosition(default2));
sp1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
{
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long id) {
String item1 = list.get(position);
actorsList = new ArrayList<>();
adapter = new ActorAdapter(Zoznam.this, "Zoznam", R.layout.novinkydata_item, actorsList);
lv.setAdapter(null);lv.setAdapter(adapter); adapter.notifyDataSetChanged();
lv.setVisibility(VISIBLE);
new GetContacts(Zoznam.this).execute(item1,"");
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
});
sp2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
{
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long id) {
String item2 = list2.get(position);
actorsList = new ArrayList<>();
adapter = new ActorAdapter(Zoznam.this, "Zoznam", R.layout.novinkydata_item, actorsList);
lv.setAdapter(null);lv.setAdapter(adapter); adapter.notifyDataSetChanged();
lv.setVisibility(VISIBLE);
new GetContacts(Zoznam.this).execute("",item2);
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
});
那么为什么新的 GetContacts(Zoznam.this).execute... 在 activity 启动后立即为两个侦听器启动?我认为 setOnItemSelectedListener 应该仅在用户与 selection 交互时启动,但默认情况下不会启动。
我这里有问题吗?
PS:当我与第一个微调器交互时,它工作正常,只有 1 个 AsyncTask 被启动,如果我与第二个微调器交互也是如此——只有第二个 AsyncTask 被启动。
问题仅在我启动 activity 时出现,然后两个 AsyncTask 都在没有与微调器进行任何交互的情况下启动。
当你设置监听器时触发监听器,因为它触发了onItemSelected。
最后我从@Jim Rhodes 建议的线程中找到了一个简单的解决方案。
sp1.setAdapter(adp1);
sp1.setSelected(false);
sp1.setSelection(0,true);
在 setAdapter 之后,我将 false 用于 setSelected,然后在微调器初始化期间不会调用 OnItemSelected()。
非常简单的解决方案并且工作正常。
我有 2 个微调器元素,如果用户更改任何微调器的 selection,我想启动一个异步任务 仅。
问题是,当我在我的设备上启动 activity 时,两个异步任务都会立即启动,即使用户没有 select 任何东西。
我尝试了什么:
final Spinner sp1 = findViewById(R.id.spinner1);
final Spinner sp2 = findViewById(R.id.spinner2);
final List<String> list = new ArrayList<String>();
list.add(getString(R.string.text1));
list.add(getString(R.string.text2));
list.add(getString(R.string.text3));
final List<String> list2 = new ArrayList<String>();
list2.add(getString(R.string.item1));
list2.add(getString(R.string.item2));
list2.add(getString(R.string.item3));
ArrayAdapter<String> adp1 = new ArrayAdapter<String>(this,
R.layout.spinner_item, list);
adp1.setDropDownViewResource(R.layout.my_spinnerlist);
sp1.setAdapter(adp1);
sp1.setSelection(((ArrayAdapter)sp1.getAdapter()).getPosition(default1));
ArrayAdapter<String> adp2 = new ArrayAdapter<String>(this,
R.layout.spinner_item, list2);
adp2.setDropDownViewResource(R.layout.my_spinnerlist);
sp2.setAdapter(adp2);
sp2.setSelection(((ArrayAdapter)sp2.getAdapter()).getPosition(default2));
sp1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
{
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long id) {
String item1 = list.get(position);
actorsList = new ArrayList<>();
adapter = new ActorAdapter(Zoznam.this, "Zoznam", R.layout.novinkydata_item, actorsList);
lv.setAdapter(null);lv.setAdapter(adapter); adapter.notifyDataSetChanged();
lv.setVisibility(VISIBLE);
new GetContacts(Zoznam.this).execute(item1,"");
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
});
sp2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
{
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long id) {
String item2 = list2.get(position);
actorsList = new ArrayList<>();
adapter = new ActorAdapter(Zoznam.this, "Zoznam", R.layout.novinkydata_item, actorsList);
lv.setAdapter(null);lv.setAdapter(adapter); adapter.notifyDataSetChanged();
lv.setVisibility(VISIBLE);
new GetContacts(Zoznam.this).execute("",item2);
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
});
那么为什么新的 GetContacts(Zoznam.this).execute... 在 activity 启动后立即为两个侦听器启动?我认为 setOnItemSelectedListener 应该仅在用户与 selection 交互时启动,但默认情况下不会启动。
我这里有问题吗?
PS:当我与第一个微调器交互时,它工作正常,只有 1 个 AsyncTask 被启动,如果我与第二个微调器交互也是如此——只有第二个 AsyncTask 被启动。
问题仅在我启动 activity 时出现,然后两个 AsyncTask 都在没有与微调器进行任何交互的情况下启动。
当你设置监听器时触发监听器,因为它触发了onItemSelected。
最后我从@Jim Rhodes 建议的线程中找到了一个简单的解决方案。
sp1.setAdapter(adp1);
sp1.setSelected(false);
sp1.setSelection(0,true);
在 setAdapter 之后,我将 false 用于 setSelected,然后在微调器初始化期间不会调用 OnItemSelected()。
非常简单的解决方案并且工作正常。