我的应用程序有一个AutoCompleteTextView,它查询Room数据库并在用户输入时将搜索结果显示在下拉菜单中。结果被正确地显示,但下拉菜单的高度总是太大了(请参见下面的截图)。
基本上,AutoCompleteTextView具有一个TextWatcher,它将当前文本发送到ViewModel,然后查询数据库。一旦接收到结果,ViewModel会更新视图状态(Flow),并且观察它的片段将AutoCompleteTextView的适配器重新分配为新数据。
下拉项布局。
碎片布局
这是我尝试过的其他方法,但都没有成功(得到了相同的结果):
下拉项布局。
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/spacing_8">
<GridLayout
android:id="@+id/imageContainer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
... />
<com.google.android.material.textview.MaterialTextView
android:id="@+id/txtName"
style="@style/TextAppearance.MaterialComponents.Body1"
android:layout_width="0dp"
android:layout_height="wrap_content"
... />
</androidx.constraintlayout.widget.ConstraintLayout>
碎片布局
<com.google.android.material.textfield.TextInputLayout>
...
<com.google.android.material.textfield.MaterialAutoCompleteTextView
android:id="@+id/autoCompleteTextView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="@dimen/spacing_16"/>
</com.google.android.material.textfield.TextInputLayout>
Adapter
internal class StationAdapter(
context: Context,
private val stations: List<UiStation>
) : ArrayAdapter<String>(
context,
R.layout.item_station,
stations.map { it.name }
) {
fun getStation(position: Int): UiStation = stations[position]
override fun getCount(): Int = stations.size
override fun getItem(position: Int): String = stations[position].name
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
return convertView ?: run {
val inflater = LayoutInflater.from(context)
val binding = ItemStationBinding.inflate(inflater, parent, false).apply {
val station = stations[position]
imageContainer.addIconsForModes(station.modes)
txtName.text = station.name
}
binding.root
}
}
...
}
Fragment
private fun handleState(state: StationSearchViewState) = with(state) {
...
stations?.let {
val adapter = StationAdapter(
context = requireContext(),
stations = it
)
binding.autoCompleteTextView.setAdapter(adapter)
}
}
这是我尝试过的其他方法,但都没有成功(得到了相同的结果):
- 将数据库表的所有结果传递给适配器并实现自定义筛选器
- 实现一个函数来提交新数据给适配器并调用
notifyDataSetChanged()
- 将AutoCompleteTextView的
android:dropDownHeight
属性设置为wrap_content
ArrayAdapter
和android.R.layout.simple_list_item_1
布局来显示项目。