代码之家  ›  专栏  ›  技术社区  ›  Amine Messaoudi

初始化中的微调器选定项更改事件触发器[重复]

  •  1
  • Amine Messaoudi  · 技术社区  · 7 年前

    在我的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 回复  |  直到 7 年前
        1
  •  1
  •   Rainmaker    7 年前

    我希望上面的解决方案能起作用,但如果它不起作用,一个简单的布尔标志将允许您检测项目何时加载。

    1、创建一个 boolean isDataLoaded = false;

    2.在您的 onItemSelected 听众

    if (isDataLoaded) { //sort categories };
    

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

        2
  •  1
  •   Pier Giorgio Misley    7 年前

    我也有几次这样想,试着打电话给你的 loadData() 方法,然后添加 setOnItemSelectedListener(...)

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

    希望这有帮助

    从评论编辑

    如果在 async thread ,它继续 background 线程和99%它将完成后 listener 已实例化。

    因此,如果要在异步线程之后填充,请在 thread 物品装载后使用 context.RunOnUiThread(...) (或更好, use AsyncTask )

    ie:实例化您调用的侦听器 spinnerAdapter.notifyDataSetChanged(); 在里面 Load DATA()

    编辑数字2

    好吧,你现在有两种可能,我不知道为什么上面的方法对你不起作用。

    1. 给我加张支票 astSelectedItem != newSelectedItem 如果为true,则在侦听器中运行代码;如果为false,则选定项不会更改,并且可以跳过事件。

    2. 手表 this SO post 并按照说明添加侦听器