package org.gnucash.android.ui.util.widget; import android.content.Context; import android.support.v7.widget.AppCompatSpinner; import android.util.AttributeSet; import android.view.View; import android.widget.AdapterView; import org.gnucash.android.ui.export.ExportFormFragment; /** * Spinner which fires OnItemSelectedListener even when an item is reselected. * Normal Spinners only fire item selected notifications when the selected item changes. * <p>This is used in {@code ReportsActivity} for the time range and in the {@link ExportFormFragment}</p> * <p>It could happen that the selected item is fired twice especially if the item is the first in the list. * The Android system does this internally. In order to capture the first one, check whether the view parameter * of {@link android.widget.AdapterView.OnItemSelectedListener#onItemSelected(AdapterView, View, int, long)} is null. * That would represent the first call during initialization of the views. This call can be ignored. * See {@link ExportFormFragment#bindViewListeners()} for an example * </p> */ public class ReselectSpinner extends AppCompatSpinner { public ReselectSpinner(Context context) { super(context); } public ReselectSpinner(Context context, AttributeSet attrs) { super(context, attrs); } public ReselectSpinner(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override public void setSelection(int position) { boolean sameSelected = getSelectedItemPosition() == position; super.setSelection(position); if (sameSelected){ OnItemSelectedListener listener = getOnItemSelectedListener(); if (listener != null) listener.onItemSelected(this, getSelectedView(), position, getSelectedItemId()); } } }