Skip to content

Instantly share code, notes, and snippets.

@IEnoobong
Created December 9, 2017 14:21
Show Gist options
  • Save IEnoobong/b5b097ad21a31db604284ddbfc50e0e4 to your computer and use it in GitHub Desktop.
Save IEnoobong/b5b097ad21a31db604284ddbfc50e0e4 to your computer and use it in GitHub Desktop.
A better way
class CustomArrayAdapter(context: Context,
@LayoutRes private val layoutResource: Int,
@IdRes private val textViewResourceId: Int = 0,
private val values: List<ModelDisplayName>) : ArrayAdapter<ModelDisplayName>(context, layoutResource, values) {
override fun getItem(position: Int): ModelDisplayName = values[position]
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val view = createViewFromResource(convertView, parent, layoutResource)
return bindData(getItem(position), view)
}
override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup): View {
val view = createViewFromResource(convertView, parent, android.R.layout.simple_spinner_dropdown_item)
return bindData(getItem(position), view)
}
private fun createViewFromResource(convertView: View?, parent: ViewGroup, layoutResource: Int): TextView {
val context = parent.context
val view = convertView ?: LayoutInflater.from(context).inflate(layoutResource, parent, false)
return try {
if (textViewResourceId == 0) view as TextView
else {
view.findViewById(textViewResourceId) ?:
throw RuntimeException("Failed to find view with ID " +
"${context.resources.getResourceName(textViewResourceId)} in item layout")
}
} catch (ex: ClassCastException){
Log.e("CustomArrayAdapter", "You must supply a resource ID for a TextView")
throw IllegalStateException(
"ArrayAdapter requires the resource ID to be a TextView", ex)
}
}
private fun bindData(value: ModelDisplayName, view: TextView): TextView {
view.text = value.displayName
return view
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment