SearchView Suggestion doesn't work with one character

android, searchview

Solution

I found a solution myself. It's not clean but it will work. I have debug into `SearchView` and then I found the ID of the `AutoCompleteTextView` from `SearchView`. Than I set the Threshold for the `AutoCompleteTextView` from 2 to 1. Now it works.

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    super.onCreateOptionsMenu(menu);
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main, menu);
    MenuItem searchItem = menu.findItem(R.id.menu_search);
    mSearchView = (SearchView) searchItem.getActionView();

    // Solution
    int autoCompleteTextViewID = getResources().getIdentifier("android:id/search_src_text", null, null);
    AutoCompleteTextView searchAutoCompleteTextView = (AutoCompleteTextView) mSearchView.findViewById(autoCompleteTextViewID);
    searchAutoCompleteTextView.setThreshold(1);
    ///////////

    mSearchView.setSuggestionsAdapter(mAdapter);

    // onItemClick
    mSearchView.setOnSuggestionListener(new SearchView.OnSuggestionListener()
    {
        @Override
        public boolean onSuggestionSelect(int position)
        {
            return false;
        }

        @Override
        public boolean onSuggestionClick(int position)
        {
            // Only for Test
            finish();
            return false;
        }
    });

    mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener()
    {
        @Override
        public boolean onQueryTextSubmit(String s)
        {
            return false;
        }

        @Override
        public boolean onQueryTextChange(String s)
        {
            final MatrixCursor c = new MatrixCursor(new String[] { BaseColumns._ID, ""     });
            for (int i=0; i < mList.size(); i++)
            {
                if (mList.get(i).toLowerCase().startsWith(s.toLowerCase()))
                {
                    c.addRow(new Object[]{i, mList.get(i)});
                }
            }
            mAdapter.changeCursor(c);

            return false;
        }
    });
return true;
}

Problem

I have a problem with my `SearchView` Suggestion, when I write one character in the `SearchView` the Suggestion doesn't come. But when I write two characters in the `EditText` of my `SearchView` the Suggestion will come. So I want that my Suggestion already come when I write one character in the `EditText` of my `SearchView`, what can I do? My Code from MainActivity: ``` private SearchView mSearchView; private SimpleCursorAdapter mAdapter; private ArrayList<String> mList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mList = new ArrayList<String>(); mList.add("Test 1"); mList.add("Test 2"); mList.add("Test 3"); mList.add("Test 4"); mList.add("Test 5"); mList.add("Test 6"); mList.add("Test 7"); mList.add("Test 8"); mList.add("Test 9"); mList.add("Test 10"); ListView listView = (ListView) findViewById(android.R.id.list); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mList); listView.setAdapter(adapter); mAdapter = new SimpleCursorAdapter(getBaseContext(), R.layout.suggestion, null, new String[] {""}, new int[] {R.id.suggestion_textView}, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main, menu); MenuItem searchItem = menu.findItem(R.id.menu_search); mSearchView = (SearchView) searchItem.getActionView(); mSearchView.setSuggestionsAdapter(mAdapter); // onItemClick mSearchView.setOnSuggestionListener(new SearchView.OnSuggestionListener() { @Override public boolean onSuggestionSelect(int position) { return false; } @Override public boolean onSuggestionClick(int position) { // Only for Test finish(); return false; } }); mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String s) { return false; } @Override public boolean onQueryTextChange(String s) { final MatrixCursor c = new MatrixCursor(new String[] { BaseColumns._ID, "" }); for (int i=0; i < mList.size(); i++) { c.addRow(new Object[] {i, mList.get(i)}); } mAdapter.changeCursor(c); return false; } }); return true; } ```

Original source