Skip to content

Instantly share code, notes, and snippets.

@ShadyRover
Created September 11, 2020 12:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ShadyRover/f36d60589f999af576107feefe7f5878 to your computer and use it in GitHub Desktop.
Save ShadyRover/f36d60589f999af576107feefe7f5878 to your computer and use it in GitHub Desktop.
import android.content.Context
import android.util.AttributeSet
import android.view.View
import android.widget.AdapterView
import android.widget.SpinnerAdapter
import androidx.appcompat.widget.AppCompatSpinner
private const val NO_POSITION = -1
class Spinner2 : AppCompatSpinner {
private var noClickSelectedPosition = NO_POSITION
private var isLoadedAdapter = false
private var withDefAction = true
constructor(context: Context?) : super(context)
constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
fun setSelection(withAction: Boolean, position: Int) {
setSelection(withAction, position, false)
}
fun setSelection(withAction: Boolean, position: Int, animate: Boolean) {
if (!withAction) {
noClickSelectedPosition = position
}
super.setSelection(position, animate)
}
override fun setSelection(position: Int) {
setSelection(withAction = true, position = position)
}
override fun setSelection(position: Int, animate: Boolean) {
setSelection(withAction = true, position = position, animate = animate)
}
override fun setAdapter(adapter: SpinnerAdapter) {
setAdapter(adapter, true)
}
fun setAdapter(adapter: SpinnerAdapter?, withAction: Boolean) {
withDefAction = withAction
isLoadedAdapter = false
super.setAdapter(adapter)
isLoadedAdapter = true
}
override fun setOnItemSelectedListener(onItemSelectedListener: OnItemSelectedListener?) {
val listener: OnItemSelectedListener = object : OnItemSelectedListener {
override fun onItemSelected(parent: AdapterView<*>?, view: View, position: Int, id: Long) {
onItemSelectedListener?.let {
if (!isLoadedAdapter || !withDefAction || isLoadedAdapter && noClickSelectedPosition == position) {
withDefAction = true
noClickSelectedPosition = NO_POSITION
return
} else {
noClickSelectedPosition = NO_POSITION
onItemSelectedListener.onItemSelected(parent, view, position, id)
}
}
}
override fun onNothingSelected(parent: AdapterView<*>?) {}
}
super.setOnItemSelectedListener(listener)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment