Android-带有简单字符串数组的ActionBar SearchView建议

Android-带有简单字符串数组的ActionBar SearchView建议,android,android-actionbar,ormlite,searchview,Android,Android Actionbar,Ormlite,Searchview,我想实现一个具有建议功能的ActionBar搜索小部件。 我已经在我的ORMLite数据库中存储了一个字符串数组,我想用它来提供建议。 在不创建大量类(提供者、可搜索…!)的情况下,我如何做到这一点?这是一个示例,希望能对您有所帮助 要在此游标中实现更多功能,例如当按下建议项时打开活动,请查看以下内容 package com.roberto.android.thetracker.app; 导入android.database.MatrixCursor; 导入android.os.Bundle;

我想实现一个具有建议功能的ActionBar搜索小部件。
我已经在我的ORMLite数据库中存储了一个字符串数组,我想用它来提供建议。

在不创建大量类(提供者、可搜索…!)的情况下,我如何做到这一点?

这是一个示例,希望能对您有所帮助

要在此游标中实现更多功能,例如当按下建议项时打开活动,请查看以下内容

package com.roberto.android.thetracker.app;
导入android.database.MatrixCursor;
导入android.os.Bundle;
导入android.provider.BaseColumns;
导入android.support.v4.app.Fragment;
导入android.support.v4.view.MenuItemCompat;
导入android.support.v4.widget.CursorAdapter;
导入android.support.v4.widget.SimpleCursorAdapter;
导入android.support.v7.widget.SearchView;
导入android.view.Menu;
导入android.view.MenuInflater;
公共类CustomSearchFragment扩展了片段{
私有静态最终字符串[]建议={
“Bauru”、“圣保罗”、“里约热内卢”,
“巴伊亚”、“马托格罗索”、“米纳斯吉拉斯”,
“托坎廷斯”,“南里奥格兰德”
};
私人简易程序或适应程序;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
最终字符串[]from=新字符串[]{“cityName”};
final int[]to=new int[]{android.R.id.text1};
mAdapter=new SimpleCursorAdapter(getActivity(),
android.R.layout.simple\u list\u item\u 1,
无效的
从…起
到
游标适配器。标志(寄存器、内容、观察者);
}
@凌驾
已创建ActivityState上的公共无效(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
设置选项菜单(真);
}
@凌驾
创建选项菜单(菜单菜单,菜单充气机){
super.onCreateOptions菜单(菜单,充气机);
充气机。充气(右菜单。主菜单,菜单);
}
@凌驾
在PrepareOptions功能表(菜单)上公共作废{
super.onPrepareOptions菜单(菜单);
最终搜索视图搜索视图=(搜索视图)菜单项匹配
.getActionView(menu.findItem(R.id.action_search));
searchView.setSuggestionAdapter(mAdapter);
searchView.setIconifiedByDefault(false);
//获取所选(单击)项目建议
searchView.setOnSuggestionListener(新的searchView.OnSuggestionListener(){
@凌驾
公共布尔onSuggestionClick(整数位置){
Cursor Cursor=(Cursor)mAdapter.getItem(position);
String txt=cursor.getString(cursor.getColumnIndex(“cityName”));
setQuery(txt,true);
返回true;
}
@凌驾
公共布尔值onSuggestionSelect(整数位置){
//你的代码在这里
返回true;
}
});
searchView.setOnQueryTextListener(新的searchView.OnQueryTextListener(){
@凌驾
公共布尔值onQueryTextSubmit(字符串s){
返回false;
}
@凌驾
公共布尔值onQueryTextChange(字符串s){
民众适应者;
返回false;
}
});
}
//必须实现逻辑才能使用OrmLite获取数据
私有void populateAdapter(字符串查询){
final MatrixCursor c=新的MatrixCursor(新字符串[]{BaseColumns.\u ID,“cityName”});
对于(int i=0;i基于的答案

你不需要有

searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {...});
你可以用这个代替那个

mAdapter.setFilterQueryProvider(new FilterQueryProvider() {
    @Override
    public Cursor runQuery(CharSequence constraint) {
        return populateAdapter((String) constraint);
    }
});
在populateAdapter上,将“return c;”替换为“mAdapter.changeCursor(c);”


请使用MatrixCursor填充自定义游标适配器,并将适配器设置为SearchView,让我知道这些信息是否足够。文档中说有这样一个构造函数
CursorAdapter(上下文上下文,游标游标)
。我尝试这样做
新建游标适配器(这个,矩阵)
矩阵是我创建的MatrixCursor。但是不可能实例化CursorAdapter…?我正确地实现了您的代码,我从我的ORMLite数据库获得了历史数组,它编译时没有任何错误。除了在数据库中输入字符串的起始字符外,什么都不会发生,当我输入第二个字符时Racker我得到了
ArrayIndexOutOfBoundsException
…我不知道为什么…这里:我将字符串数组转换为ArrayList,以便以后添加。谢谢,非常有用的示例。节省了我的时间@betorcs@hitesh-sarsava、
from
是光标列名称,
to
是视图id@betorcs最后我发现了问题,默认的自动完成文本视图的保留是2个字符,这就是为什么它不适用于单个字符。我必须这样做((自动完成文本视图)searchView.findViewById(R.id.search\u src\u text))。设置阈值(1)当这个代码可能会回答这个问题时,你可能会考虑添加一些解释性句子,因为这会增加你的答案对其他用户的价值。
mAdapter.setFilterQueryProvider(new FilterQueryProvider() {
    @Override
    public Cursor runQuery(CharSequence constraint) {
        return populateAdapter((String) constraint);
    }
});
private Cursor populateAdapter(String query) {
    .
    .
    .
    return c;
}
 private String getSuggestion(int position) {
        MatrixCursor cursor = (MatrixCursor) searchView.getSuggestionsAdapter().getCursor();
        String suggest1 = cursor.getString(position);


        return SUGGESTIONS[Integer.valueOf(suggest1)];
    }