package org.tvbrowser.view; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.support.v4.app.Fragment; import android.util.AttributeSet; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; /** Spinner extension that calls onItemSelected even when the selection is the same as its previous value * * Taken from http://stackoverflow.com/questions/5335306/how-can-i-get-an-event-in-android-spinner-when-the-current-selected-item-is-sele * * */ @SuppressLint("ClickableViewAccessibility") public class NDSpinner extends android.support.v7.widget.AppCompatSpinner { private GestureDetector mClickDetector; private OnCreateContextMenuListener mLongClickListener; public NDSpinner(Context context) { super(context); setClickDetector(context); } public NDSpinner(Context context, AttributeSet attrs){ super(context, attrs); setClickDetector(context); } public NDSpinner(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setClickDetector(context); } private void setClickDetector(Context context) { setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return mClickDetector.onTouchEvent(event); } }); mClickDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { public void onLongPress(MotionEvent e) { if(mLongClickListener != null) { if(mLongClickListener instanceof Fragment) { Activity test = ((Fragment)mLongClickListener).getActivity(); if(test != null) { test.openContextMenu(NDSpinner.this); } } } } @Override public boolean onSingleTapConfirmed(MotionEvent e) { return performClick(); } }); } @Override public void setOnCreateContextMenuListener(OnCreateContextMenuListener l) { mLongClickListener = l; super.setOnCreateContextMenuListener(l); } @Override public void setSelection(int position) { super.setSelection(position); boolean sameSelected = position == getSelectedItemPosition(); if (sameSelected) { // Spinner does not call the OnItemSelectedListener if the same item is selected, so do it manually now OnItemSelectedListener listener = getOnItemSelectedListener(); if(listener != null) { listener.onItemSelected(this, getSelectedView(), position, getSelectedItemId()); } } } @Override public boolean onTouchEvent(MotionEvent event) { return true; } }