我正在开发一个用Scala编写的Android应用程序,它在android.support.v7.widget.SearchView
覆盖的操作栏中使用android.support.v7.widget.Toolbar
。
在应用中,我需要为SearchView
启用搜索建议。因此,每次检测到查询更改时,都会检查是否需要更新建议(下面的代码)。如果需要更新建议,则会对后端进行调用,并创建包含搜索建议的android.database.MatrixCursor
,并在SearchView
的建议适配器(下面的代码)上设置。
我遇到的问题是,在输入单个字符时,搜索提示不会显示。在搜索框中键入两个或多个字符可以很好地工作。
我尝试在我的XML配置中将android:searchSuggestThreshold
设置为0
和1
并得到相同的结果(例如忽略该选项):搜索提示显示多个输入字符,但不显示单个字符。
我在SearchView
的配置/初始化中遗漏了什么?像我可以设置的android:searchSuggestThreshold
以外的选项一样?我花了最后几个小时寻找其他选择但却找不到。
我看到的一个可能的解决方案是让AutoCompleteTextView
支持SearchView
的输入并将其阈值设置为1,但这是一个丑陋的(hack-ish)解决方案{ {1}} API未公开{1}}。
有谁知道这个优雅的解决方案?
谢谢!
检测搜索字词更改:
AutoCompleteTextView
更新搜索建议:
SearchView
菜单SearchView初始化:
//this gets called whenever something is changed in the search box. "s" contains the entire search term typed in the search box
def onQueryTextChange(s: String): Boolean = {
//this checks to see if a call should be made to the backend to update suggestions
SearchSuggestionController.query(s)
//return false as we're not consuming the event
false
}
可搜索的配置:
def updateSuggestions(suggestions: Array[String]): Unit = {
val cursor = new MatrixCursor(Array(BaseColumns._ID, SearchManager.SUGGEST_COLUMN_TEXT_1), suggestions.length)
for{
i <- suggestions.indices
s = suggestions(i)
} cursor.addRow(Array[AnyRef](i.toString, s))
getActivity.runOnUiThread(() => {
searchSuggestionAdapter.changeCursor(cursor)
searchSuggestionAdapter.notifyDataSetChanged()
})
}
答案 0 :(得分:2)
您必须处理SearchView对象使用的SearchAutoComplete对象,然后务实地将其阈值设置为1.(如果您尝试将其设置为0,它将变为1,它就像在幕后实现一样)不幸的是它不会工作出于某种原因来自XML。
SearchView.SearchAutoComplete mSearchSrcTextView = (SearchView.SearchAutoComplete) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
// show results from 1 char
mSearchSrcTextView.setThreshold(1);
答案 1 :(得分:0)
我在这里看到你关于“优雅解决方案”的观点非常好但是我担心如果你想实现你的目标,Android API会强迫你多次做“不优雅”:)
我不知道直接在AutoCompleteTextView
上设置阈值的解决方法,但如果没有,我建议你做一个(不是很好)更多可能有用的步骤:
获取EditText的实例:
AutoCompleteTextView searchText = (AutoCompleteTextView) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
并强制在onQueryTextChange中显示文本长度等于1的建议:
if(s.length() == 1){
searchText.showDropDown();
{
答案 2 :(得分:0)
在SearchView上设置OnQueryTextListener。利用其onQueryTextChange更新适配器。