Я сделал расширение ArrayAdapter
, которое максимально сохраняет его функциональность, просто устанавливает длинное описание для выбранного элемента.
Во-первых, нам нужна новая модель для питания адаптера. Обратите внимание, что toString()
возвращает shortDescription
, так что ArrayAdapter
показывает краткое описание в раскрывающемся списке:
data class DescriptiveArrayItem(val shortDescription: String, val longDescription: String) {
override fun toString(): String {
return shortDescription
}
}
Во-вторых, мы создаем наш собственный адаптер, который переопределяет getView()
и показывает длинное описание при выборе элемента (к сожалению, многие поля и методы в ArrayAdapter
являются приватными, поэтому мне пришлось их скопировать):
class DescriptiveArrayAdapter : ArrayAdapter<DescriptiveArrayItem> {
private var mResource: Int
private val mFieldId: Int
private val mContext: Context
private val mInflater: LayoutInflater
constructor(context: Context, resource: Int) : super(context, resource) {
mContext = context
mFieldId = 0
mInflater = LayoutInflater.from(context)
mResource = resource
}
constructor(context: Context, resource: Int, textViewResourceId: Int) : super(context, resource, textViewResourceId) {
mContext = context
mFieldId = textViewResourceId
mInflater = LayoutInflater.from(context)
mResource = resource
}
constructor(context: Context, resource: Int, objects: Array<out DescriptiveArrayItem>) : super(context, resource, objects) {
mContext = context
mFieldId = 0
mInflater = LayoutInflater.from(context)
mResource = resource
}
constructor(context: Context, resource: Int, textViewResourceId: Int, objects: Array<out DescriptiveArrayItem>) : super(context, resource, textViewResourceId, objects) {
mContext = context
mFieldId = textViewResourceId
mInflater = LayoutInflater.from(context)
mResource = resource
}
constructor(context: Context, resource: Int, objects: List<DescriptiveArrayItem>) : super(context, resource, objects) {
mContext = context
mFieldId = 0
mInflater = LayoutInflater.from(context)
mResource = resource
}
constructor(context: Context, resource: Int, textViewResourceId: Int, objects: List<DescriptiveArrayItem>) : super(context, resource, textViewResourceId, objects) {
mContext = context
mFieldId = textViewResourceId
mInflater = LayoutInflater.from(context)
mResource = resource
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
return createViewFromResource(mInflater, position, convertView, parent, mResource)
}
private fun createViewFromResource(inflater: LayoutInflater, position: Int,
convertView: View?, parent: ViewGroup, resource: Int): View {
val text: TextView?
val view: View = convertView ?: inflater.inflate(resource, parent, false)
try {
if (mFieldId == 0) {
// If no custom field is assigned, assume the whole resource is a TextView
text = view as TextView
} else {
// Otherwise, find the TextView field within the layout
text = view.findViewById(mFieldId)
if (text == null) {
throw RuntimeException("Failed to find view with ID "
+ mContext.resources.getResourceName(mFieldId)
+ " in item layout")
}
}
} catch (e: ClassCastException) {
Log.e("ArrayAdapter", "You must supply a resource ID for a TextView")
throw IllegalStateException(
"ArrayAdapter requires the resource ID to be a TextView", e)
}
val item: DescriptiveArrayItem? = getItem(position)
text.text = item?.longDescription
return view
}
}
person
Miloš Černilovský
schedule
24.06.2020