【问题标题】:Spinner OnclickListener event executes twice, how to handle both eventsSpinner OnclickListener 事件执行两次,如何处理这两个事件
【发布时间】:2011-11-01 01:40:45
【问题描述】:

Spinner OnclickListener 事件执行两次 -

  • 微调器初始化
  • 手动选择用户

监听器的实现如下:

spinner.setOnItemSelectedListener(new OnItemSelectedListener() {           
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

            }

            public void onNothingSelected(AdapterView<?> parent) {

            }
        });

问题定义

当用户从微调器中选择任何项目时,我想将用户选择的文本保存到数据存储中,我能够做到这一点。但是我的另一个任务是在微调器中将先前选择的项目(从数据存储访问)显示为选定项目,但是每次当我调用微调器的活动时,微调器都会将第一个项目显示为默认选择的项目,并且在数据存储中它也会更改先前项目为默认值。

如何区分“微调器初始化”和“用户手动选择”事件?

【问题讨论】:

    标签: android spinner


    【解决方案1】:

    您可以在将项目添加到适配器的同时调用setSelection,参见此示例:How to avoid onItemSelected to be called twice in Spinners

    【讨论】:

      【解决方案2】:

      您必须从逻辑上处理这两个事件。由于这些参考资料(Android Spinner selectionproblem on spinner)说你必须使用标志变量来处理这个问题,所以我放了一个代码示例。

      希望这能帮助你理清逻辑。

      public class TestActivity extends Activity {  
      
          //Checks report spinner selection is default or user selected item
          private boolean isDefaultSelection;
          //Spinner setup
          Spinner spinner;
      
         @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.your_layout);
      
              // Set true at onCreate
              isDefaultSelection = true;
      
               spinner = (Spinner) findViewById(R.id.id_of_spinner);      
              ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String> (this, R.layout.drop_down_custom_row, data);
              //Implement custom view for drop down of spinner
              //spinnerAdapter.setDropDownViewResource( android.R.layout.simple_spinner_dropdown_item);
              spinner.setAdapter(spinnerAdapter);
              spinner.setOnItemSelectedListener(new OnItemSelectedListener() {          
                  public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
      
                      if(isDefaultSelection) { //If spinner initializes
                          spinner.setSelection("Set_here_id_of_data_item_from_storage_which_was_previously_stored");
                          isDefaultSelection = false;
                      } else { //If user manually select item
                          int itemPosition = spinner.getSelectedItemPosition();
                          //Write here code to store selection (itemPosition) of user into data storage
                      }
                  }
      
                  public void onNothingSelected(AdapterView<?> parent) {
                      //User selected same item. Nothing to do.
                  }
              });
      
          }
      
      }
      

      希望它能消除您的疑虑。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-29
        • 2014-08-26
        • 1970-01-01
        • 2020-07-16
        • 1970-01-01
        • 1970-01-01
        • 2011-07-08
        相关资源
        最近更新 更多