如何让AutoCompleteTextView下拉列表随显示选项自动调整尺寸?
Android AutoCompleteTextView 下拉列表自适应尺寸方案
我的实现代码
Kotlin 逻辑代码
val arrayAdapter = context?.let { ArrayAdapter<String>( it, // Context android.R.layout.simple_list_item_1, autocompleteOptions // Array ) } autoCompleteTextView.setAdapter(arrayAdapter) // 设置选项点击监听 autoCompleteTextView.onItemClickListener = AdapterView.OnItemClickListener { parent, _, position, _ -> // 自定义逻辑 }
XML 布局代码
<AutoCompleteTextView android:id="@+id/actvSearch" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:textAppearance="?android:attr/textAppearanceListItemSmall" android:completionThreshold="0" android:dropDownHeight="200dp" android:layout_gravity="center_vertical" />
问题
能否根据下拉列表当前显示的选项数量自动调整其尺寸?
解决方案
可以实现下拉列表尺寸随选项数量自适应,以下是两种可行方案:
1. 移除固定高度限制(最简单方式)
直接删除XML中android:dropDownHeight="200dp"这一行。默认情况下,AutoCompleteTextView的下拉列表会自动适配选项数量:
- 当选项较少时,下拉列表高度会包裹所有选项;
- 当选项较多时,会自动限制最大高度(通常为屏幕高度的一半)并显示滚动条。
2. 自定义高度计算(精细控制)
如果需要限制最大显示行数,同时在选项不足时自动收缩高度,可以通过以下方式实现:
方式一:自定义Adapter测量高度
class AdaptiveArrayAdapter( context: Context, resource: Int, private val items: List<String> ) : ArrayAdapter<String>(context, resource, items) { private var itemHeight = 0 override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { val view = super.getView(position, convertView, parent) // 首次测量单个选项的高度 if (itemHeight == 0) { view.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED) itemHeight = view.measuredHeight } return view } // 计算下拉列表高度,最多显示maxVisibleItems行 fun getAdaptiveHeight(maxVisibleItems: Int = 5): Int { if (itemHeight == 0 || items.isEmpty()) return 0 return min(items.size, maxVisibleItems) * itemHeight } }
然后在代码中设置并动态调整高度:
val adapter = AdaptiveArrayAdapter(context, android.R.layout.simple_list_item_1, autocompleteOptions) autoCompleteTextView.setAdapter(adapter) // 点击输入框时计算并设置下拉高度 autoCompleteTextView.setOnTouchListener { _, _ -> autoCompleteTextView.post { autoCompleteTextView.dropDownHeight = adapter.getAdaptiveHeight() } false }
方式二:反射修改PopupWindow高度
AutoCompleteTextView的下拉列表基于ListPopupWindow实现,可通过反射获取该实例并设置高度为WRAP_CONTENT:
autoCompleteTextView.setOnTouchListener { _, _ -> autoCompleteTextView.post { try { val popupField = AutoCompleteTextView::class.java.getDeclaredField("mPopup") popupField.isAccessible = true val listPopup = popupField.get(autoCompleteTextView) as ListPopupWindow listPopup.height = ListPopupWindow.WRAP_CONTENT } catch (e: Exception) { e.printStackTrace() } } false }
注意:反射方式可能因Android版本或厂商定制出现兼容性问题,优先推荐自定义Adapter方案。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

