8

我在 Android 应用程序中使用微调器控件,并通过一种onItemSelectedListener()方法处理用户选择。当做出与当前选择不同的选择时,这似乎可以正常工作。我想在某些条件下将所有微调器重置为默认值并确保所有人都需要这样做onItemSelectedListener()

onItemSelectedListener()它是仅在用户选择更改时才调用的 Android 语义的一部分吗?有没有办法强制onItemSelectedListener()调用?

4

3 回答 3

12

如果您希望触发 Spinner 的“onItemSelected”,即使选择了微调器中的项目/如果选择了项目并再次单击它。然后使用这个扩展微调器的自定义类,这对我有用

然后用这样的微调器编辑你的活动,我改变了

  static Spinner spinner1;

  static NDSpinner spinner1;

   variables.spinner1 = (Spinner) findViewById(R.id.spinner1); 

   variables.spinner1 = (NDSpinner ) findViewById(R.id.spinner1); 

我还更改了微调器所在的 xml 布局

    <Spinner
    android:id="@+id/spinner1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/place" />

    <com.yourpackagename.NDSpinner 
     android:id="@+id/spinner1"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:text="@string/place" />

微调器扩展类:

 package com.yourpackagename;
 import android.content.Context;
 import android.util.AttributeSet;
 import android.util.Log;
 import android.widget.Spinner;
 import android.widget.Toast;
 import java.lang.reflect.Field;

     /** Spinner extension that calls onItemSelected even when the selection is the same as       its previous value. 
       *   ie This is extended "Customized class of Spinner" to  get the "onItemSelected"      event even if the item in the
     *  Spinner is already  selected by the user*/
    public class NDSpinner extends Spinner {

      public NDSpinner(Context context)
      { super(context); }

      public NDSpinner(Context context, AttributeSet attrs)
      { super(context, attrs); }

      public NDSpinner(Context context, AttributeSet attrs, int defStyle)
      { super(context, attrs, defStyle); }


      private void ignoreOldSelectionByReflection() {
            try {
                Class<?> c = this.getClass().getSuperclass().getSuperclass().getSuperclass();
                Field reqField = c.getDeclaredField("mOldSelectedPosition");
                reqField.setAccessible(true);
                reqField.setInt(this, -1);
            } catch (Exception e) {
                Log.d("Exception Private", "ex", e);
                // TODO: handle exception
            }
        }

      @Override
      public void  setSelection(int position, boolean animate)
      {
        boolean sameSelected = position == getSelectedItemPosition();
        ignoreOldSelectionByReflection();
        super.setSelection(position, animate);
        if (sameSelected) {
          // Spinner does not call the OnItemSelectedListener if the same item is selected, so do it manually now
          getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId());


        }
      }
      @Override
      public void setSelection(int position) {
          ignoreOldSelectionByReflection();
          super.setSelection(position);
      }

    }
于 2013-09-09T07:54:41.717 回答
3

当您选择与当前选择的项目相同的项目时,默认 Spinner 不会触发任何事件。您需要制作一个自定义 Spinner 才能执行此操作。请参阅再次选择当前选定项目时如何在 Android Spinner 中获取事件?

于 2012-11-01T21:45:48.223 回答
0

如果您想使用默认微调器每次添加相同的适配器:

@Override public void onItemSelected(AdapterView adapter, View v, int position, long lng) {

   spinner.setAdapter(adapter);

}
于 2020-04-01T11:19:39.457 回答