Android 如何让Actionbar中的SearchView从第一个角色开始给我建议?

Android 如何让Actionbar中的SearchView从第一个角色开始给我建议?,android,search,android-actionbar,Android,Search,Android Actionbar,我刚刚在Actionbar中实现了“android.support.v7.widget.SearchView”来搜索一些pdf文件。 当我为搜索插入多个字符时,建议列表会显示得很好。但是当我只输入一个字符时,没有显示任何建议,尽管调用了填充建议的函数。 您是否知道如何改变这种行为,以便在只输入一个字符时显示建议 这就是我在菜单中定义searchview的地方 <menu xmlns:android="http://schemas.android.com/apk/res/android"

我刚刚在Actionbar中实现了“android.support.v7.widget.SearchView”来搜索一些pdf文件。 当我为搜索插入多个字符时,建议列表会显示得很好。但是当我只输入一个字符时,没有显示任何建议,尽管调用了填充建议的函数。 您是否知道如何改变这种行为,以便在只输入一个字符时显示建议

这就是我在菜单中定义searchview的地方

<menu xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto">
<item
    android:id="@+id/pdf_menu_search_item"
    android:icon="@mipmap/ic_search_white_24dp"
    android:title="Suche"
    app:actionViewClass="android.support.v7.widget.SearchView"
    app:showAsAction="always"/></menu> 

在我的活动中,实现了以下代码:

private static final String[] SUGGESTIONS = {
        "Amsterdam","Berlin","Rome"
};
private SimpleCursorAdapter mAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_contextual_actionbar, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    return super.onOptionsItemSelected(item);
}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    final SearchView mSearchView;
    mSearchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.pdf_menu_search_item));
    final String[] from = new String[] {"cityName"};
    final int[] to = new int[] {android.R.id.text1};
    mAdapter = new SimpleCursorAdapter(Startseite.this,
            android.R.layout.simple_list_item_1,
            null,
            from,
            to,
            CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);

    mSearchView.setSuggestionsAdapter(mAdapter);
    mSearchView.setOnSuggestionListener(new SearchView.OnSuggestionListener() {
        @Override
        public boolean onSuggestionClick(int position) {
            return true;
        }

        @Override
        public boolean onSuggestionSelect(int position) {
            return true;
        }
    });

    mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {

            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            populateAdapter(newText);
            return true;
        }
    });
    return super.onPrepareOptionsMenu(menu);
}
// You must implements your logic to get data using OrmLite
private void populateAdapter(String query) {
    final MatrixCursor c = new MatrixCursor(new String[]{ BaseColumns._ID, "cityName" });
    for (int i=0; i<SUGGESTIONS.length; i++) {
        if (SUGGESTIONS[i].toLowerCase().startsWith(query.toLowerCase()))
         {   c.addRow(new Object[] {i, SUGGESTIONS[i]}); }
    }
    mAdapter.changeCursor(c);
    mAdapter.notifyDataSetChanged();
}
private静态最终字符串[]建议={
“阿姆斯特丹”、“柏林”、“罗马”
};
私人简易程序或适应程序;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(R.menu.menu\u上下文\u操作栏,菜单);
返回true;
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
int id=item.getItemId();
返回super.onOptionsItemSelected(项目);
}
@凌驾
公共布尔值OnPrepareOptions菜单(菜单){
最终搜索视图;
mSearchView=(SearchView)MenuItemCompat.getActionView(menu.findItem(R.id.pdf_menu_search_item));
最终字符串[]from=新字符串[]{“cityName”};
final int[]to=new int[]{android.R.id.text1};
mAdapter=new SimpleCursorAdapter(startSite.this,
android.R.layout.simple\u list\u item\u 1,
无效的
从…起
到
游标适配器。标志(寄存器、内容、观察者);
mSearchView.setSuggestionAdapter(mAdapter);
mSearchView.setOnSuggestionListener(新的SearchView.OnSuggestionListener(){
@凌驾
公共布尔onSuggestionClick(整数位置){
返回true;
}
@凌驾
公共布尔值onSuggestionSelect(整数位置){
返回true;
}
});
mSearchView.setOnQueryTextListener(新的SearchView.OnQueryTextListener(){
@凌驾
公共布尔值onQueryTextSubmit(字符串查询){
返回false;
}
@凌驾
公共布尔onQueryTextChange(字符串newText){
populateAdapter(新文本);
返回true;
}
});
返回super.onPrepareOptions菜单(菜单);
}
//必须实现逻辑才能使用OrmLite获取数据
私有void populateAdapter(字符串查询){
final MatrixCursor c=新的MatrixCursor(新字符串[]{BaseColumns.\u ID,“cityName”});

对于(inti=0;i我刚刚找到了答案。 如果您使用的是AppCompatActivity(像我一样),则可以这样设置searchview阈值:

AutoCompleteTextView searchAutoCompleteTextView = (AutoCompleteTextView) mSearchView.findViewById(getResources().getIdentifier("search_src_text", "id", getPackageName()));
searchAutoCompleteTextView.setThreshold(1);
现在,搜索建议将从上的第一个字符开始显示。 也许这对其他人有帮助:)