在我的Android应用程序中,我有一个微调器,我用一些类别初始化
public void loadData()
{
Thread t=new Thread(new Runnable()
{
@Override
public void run()
{
try
{
String link="http://"+Static.host+"/allcategories/?format=json";
String json="";
URL url = new URL(link);
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
String line;
while ((line = in.readLine()) != null)
{
json += line;
}
in.close();
JSONArray elements=new JSONArray(json);
for (int i = 0; i < elements.length(); i++)
{
JSONObject category=elements.getJSONObject(i);
spinnerArray.add(category.getString("title"));
}
runOnUiThread(new Runnable()
{
@Override
public void run()
{
spinnerAdapter.notifyDataSetChanged();
}
});
}
catch(Exception e)
{
e.printStackTrace();
}
}
});
t.start();
try
{
t.join();
}
catch (Exception e)
{
Toast.makeText(MainActivity.this,e.getMessage(),Toast.LENGTH_LONG).show();
}
}
我创建了一个基于所选类别
搜索文章的功能public void getArticlesByCategory(String category)
{
// I search articles and I display them in a listview
}
然后我为微调器
创建了一个事件监听器spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
{
@Override
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id)
{
getArticlesByCategory(spinner.getSelectedItem().toString());
}
@Override
public void onNothingSelected(AdapterView<?> adapterView)
{
}
});
最后我在onCreate中调用loadData
loadData();
问题是在微调器初始化时触发了事件,每次添加新元素时都会调用getArticlesByCategory。
我想知道只有当我从微调器中手动选择时才能触发事件。
答案 0 :(得分:1)
这也有几次让我感到兴奋,在添加loadData()
之前尝试调用setOnItemSelectedListener(...)
方法
这将在设置事件侦听器之前添加项目,并且不会触发它
希望这有帮助
如果您填充async thread
中的列表,则会在background
主题上进行填充,99%将在listener
实例化后完成。
因此,如果您想在异步线程之后填充,请在使用thread
加载项目之后在context.RunOnUiThread(...)
中添加侦听器初始化(或更好,use AsyncTask)
IE:实例化您在spinnerAdapter.notifyDataSetChanged();
loadData()
的侦听器
好的,此时你有两种可能性,我不知道为什么它不适合你。
添加对astSelectedItem != newSelectedItem
的检查,如果为true,则在侦听器中运行代码,如果为false,则所选项目不会更改,您可以跳过该事件。
观看this SO post并按照说明添加听众
答案 1 :(得分:1)
我希望上面的解决方案能够正常工作,但如果没有,那么简单的布尔标志将允许您检测项目的加载时间。
1.创建boolean isDataLoaded = false;
2.在onItemSelected
听众
if (isDataLoaded) { //sort categories };
3.加载数据时只需将布尔值设置为true
;