【发布时间】:2023-02-01 09:02:39
【问题描述】:
我的应用程序有一个 AutoCompleteTextView,它查询 Room 数据库并在用户键入时在下拉列表中显示搜索结果。 结果显示正确,但下拉列表的高度对于项目数量来说总是太大(请参见下面的屏幕截图)。
基本上,AutoCompleteTextView 有一个 TextWatcher,它将当前文本发送到 ViewModel,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>
适配器
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
}
}
...
}
分段
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布局时
【问题讨论】:
-
找到任何解决方案?
标签: android layout dropdown autocompletetextview