2014-06-17 15 views
7

Ho un problema con il mio suggerimento SearchView, quando scrivo un carattere nello SearchView il suggerimento non viene. Ma quando scrivo due caratteri nello EditText del mio SearchView verrà il suggerimento.SearchView Suggerimento non funziona con un carattere

Quindi voglio che il mio suggerimento venga già quando scrivo un carattere nello EditText del mio SearchView, cosa posso fare?

My Code da 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; 
} 

risposta

23

ho trovato una soluzione io stesso. Non è pulito ma funzionerà. Ho eseguito il debug in SearchView e ho trovato l'ID dello AutoCompleteTextView da SearchView. Poi ho impostato la Soglia per il AutoCompleteTextView da 2 a 1. Ora funziona.

@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; 
} 
+5

se si sta utilizzando appcompat l'id dovrebbe essere 'getResources(). GetIdentifier ("search_src_text", "id", getPackageName())' – user1256821

+2

Se stai usando appcompat è anche possibile fare riferimento direttamente il ' R.id.search_src_text' – Moritz

+0

@ user3747780 Sei la mia persona preferita – Nazerke

Problemi correlati