You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 07:15:32