初始化时,微调器选择项目更改事件触发器

时间:2018-06-18 15:43:15

标签: android spinner

在我的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。

我想知道只有当我从微调器中手动选择时才能触发事件。

2 个答案:

答案 0 :(得分:1)

这也有几次让我感到兴奋,在添加loadData()之前尝试调用setOnItemSelectedListener(...)方法

这将在设置事件侦听器之前添加项目,并且不会触发它

希望这有帮助

从评论

编辑

如果您填充async thread中的列表,则会在background主题上进行填充,99%将在listener实例化后完成。

因此,如果您想在异步线程之后填充,请在使用thread加载项目之后在context.RunOnUiThread(...)中添加侦听器初始化(或更好,use AsyncTask

IE:实例化您在spinnerAdapter.notifyDataSetChanged();

中调用loadData()的侦听器

编辑编号2

好的,此时你有两种可能性,我不知道为什么它不适合你。

  1. 添加对astSelectedItem != newSelectedItem的检查,如果为true,则在侦听器中运行代码,如果为false,则所选项目不会更改,您可以跳过该事件。

    < / LI>
  2. 观看this SO post并按照说明添加听众

答案 1 :(得分:1)

我希望上面的解决方案能够正常工作,但如果没有,那么简单的布尔标志将允许您检测项目的加载时间。

1.创建boolean isDataLoaded = false;

2.在onItemSelected听众

中添加条件
if (isDataLoaded) { //sort categories };

3.加载数据时只需将布尔值设置为true;