我可以设置我的 Android 下拉列表布局来包装冗长的项目吗?
Can I setup my an Android drop-down list layout to wrap lengthy items?
问题 - 尝试做: 我一直未能成功地尝试将下拉列表中的冗长项目换行。我真的不确定这是否可能。我有一个包含问题选项的下拉列表,在某些情况下可能会很长。
我的尝试: 我已经为用于填充 AutoCompleteTextView
的适配器创建了自定义 TextView
布局。我尝试了 wrap-content
、android:singleLine=false
、android:lines="2"
的常规组合,但都没有成功。我真的以为以前可能有人试过这个
布局
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minHeight="25dp"
android:padding="5dp"
android:singleLine="false"
style="@style/MyDropDownTheme"
android:id="@+id/text1" android:hint="@string/hint_type">
</TextView>
数组适配器
ArrayAdapter questions = new ArrayAdapter<>(context, R.layout.custom_drowdown_list_wrap, orgQuestions);
question.setAdapter(questions);
为此,您需要一个自定义 Spinner
,它是 Adapter
。像这样的东西会对你有所帮助。
class DynamicSizeSpinner : androidx.appcompat.widget.AppCompatSpinner {
var inOnMeasure = false
private set
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
inOnMeasure = true
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
inOnMeasure = false
}
}
class SpinnerArrayAdapter(context: Context, @LayoutRes layout: Int, val entries: Map<String, String>) : ArrayAdapter<String>(context, layout, entries.keys.toList()) {
override fun isEnabled(position: Int): Boolean {
return position != 0
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val selectedItemPosition = when (parent) {
is AdapterView<*> -> parent.selectedItemPosition
is DynamicSizeSpinner -> parent.selectedItemPosition
else -> position
}
return makeLayout(selectedItemPosition, convertView, parent, R.layout.simple_spinner_dropdown_item_custom)
}
override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup): View {
return makeLayout(position, convertView, parent, R.layout.simple_spinner_dropdown_item_custom)
}
private fun makeLayout(position: Int, convertView: View?, parent: ViewGroup, layout: Int): View {
val tv = convertView ?: LayoutInflater.from(context).inflate(layout, parent, false)
if (position != -1) {
(tv as? TextView)?.text = entries.keys.toList()[position]
}
return tv
}
}
我使用 Map
作为条目,您可以使用 List
或 Array
问题 - 尝试做: 我一直未能成功地尝试将下拉列表中的冗长项目换行。我真的不确定这是否可能。我有一个包含问题选项的下拉列表,在某些情况下可能会很长。
我的尝试: 我已经为用于填充 AutoCompleteTextView
的适配器创建了自定义 TextView
布局。我尝试了 wrap-content
、android:singleLine=false
、android:lines="2"
的常规组合,但都没有成功。我真的以为以前可能有人试过这个
布局
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minHeight="25dp"
android:padding="5dp"
android:singleLine="false"
style="@style/MyDropDownTheme"
android:id="@+id/text1" android:hint="@string/hint_type">
</TextView>
数组适配器
ArrayAdapter questions = new ArrayAdapter<>(context, R.layout.custom_drowdown_list_wrap, orgQuestions);
question.setAdapter(questions);
为此,您需要一个自定义 Spinner
,它是 Adapter
。像这样的东西会对你有所帮助。
class DynamicSizeSpinner : androidx.appcompat.widget.AppCompatSpinner {
var inOnMeasure = false
private set
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
inOnMeasure = true
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
inOnMeasure = false
}
}
class SpinnerArrayAdapter(context: Context, @LayoutRes layout: Int, val entries: Map<String, String>) : ArrayAdapter<String>(context, layout, entries.keys.toList()) {
override fun isEnabled(position: Int): Boolean {
return position != 0
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val selectedItemPosition = when (parent) {
is AdapterView<*> -> parent.selectedItemPosition
is DynamicSizeSpinner -> parent.selectedItemPosition
else -> position
}
return makeLayout(selectedItemPosition, convertView, parent, R.layout.simple_spinner_dropdown_item_custom)
}
override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup): View {
return makeLayout(position, convertView, parent, R.layout.simple_spinner_dropdown_item_custom)
}
private fun makeLayout(position: Int, convertView: View?, parent: ViewGroup, layout: Int): View {
val tv = convertView ?: LayoutInflater.from(context).inflate(layout, parent, false)
if (position != -1) {
(tv as? TextView)?.text = entries.keys.toList()[position]
}
return tv
}
}
我使用 Map
作为条目,您可以使用 List
或 Array