【问题标题】:spinner.setSelection not calling setOnItemSelectedListener functionsspinner.setSelection 不调用 setOnItemSelectedListener 函数
【发布时间】:2020-09-25 17:45:11
【问题描述】:

我有 3 个旋转器。设置前一个微调器时,每个微调器都会获得新数据。 所以我在这些微调器上嵌套了 setOnItemSelectedListener。

我的代码是这样的:

 MyAdapter adapter = new MyAdapter(getActivity(), R.layout.res_custom_new, categories, response.body(), pos);
 adapter.setDropDownViewResource(R.layout.res_custom_new);
 spinner.setAdapter(adapter);
 spinner.setSelection(pos);

 spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
     @Override
     public void onItemSelected(AdapterView << ? > adapterView, View view, int ii, long l) {
         //some code A
         second_spinner_destination_function();
     }
 });

second_spinner_destination_function() 包含另外 2 个微调器

public void second_spinner_destination_function() {
 //some code
 ArrayAdapter < String > dataAd = new ArrayAdapter < String > (getActivity(), android.R.layout.simple_spinner_item, getDestination);
 dataAd.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
 spinnerdestination.setAdapter(dataAd);
 spinnerdestination.setSelection(posfrom);
 //code block B
 spinnerdestination.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
     @Override
     public void onItemSelected(AdapterView << ? > adapterView, View view, final int i, long l) {

         //some code C
         ArrayAdapter < String > dataAdapter2 = new ArrayAdapter < String > (getActivity(), android.R.layout.simple_spinner_item, getVesselName);
         dataAdapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
         third_spinnervessels.setAdapter(dataAdapter2);
         third_spinnervessels.setSelection(posvessel);
         spinnervessels.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
             @Override
             public void onItemSelected(AdapterView << ? > adapterView, View view, int iii, long l) {

             }
         });
         //some code D              

     }
 });
 //some Code E
 }

上面的代码首先在 onCreate 函数中被调用。之后,如果下拉列表发生更改,则相关代码将运行。

现在我的问题是:由于所有这些代码行在 oncreate 期间都运行过一次,因此设置了微调器上的侦听器。现在假设我点击了第一个微调器并改变了一些东西。所以它现在将“编码块 A”,然后调用 second_spinner_destination_function()。

在 second_spinner_destination_function() 中,当遇到 spinnerdestination.setSelection(posfrom) 行时,它应该立即运行其 onItemSelected() 函数,但它会运行代码块 B,然后在其上设置新的侦听器,然后运行'代码块 E ' 然后运行第二个微调器的 onItemSelected()。

我已确保 spinnerdestination.setSelection(posfrom) 正在获取新索引,而不是与旧索引相同。知道为什么它按这个顺序运行吗?

【问题讨论】:

    标签: java android listener spinner android-spinner


    【解决方案1】:

    您必须分离微调器,因为此方法会立即在连接到适配器的微调器上运行

    spinnervessels.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @覆盖 public void onItemSelected(AdapterView adapterView, View view, int iii, long l) {

           }
    

    【讨论】:

    • 您能否再解释一下,您所说的分开是什么意思?我也检查了一下,它在 setselection() 之后没有立即运行
    猜你喜欢
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多