Android Action Bar SearchView como Autocompletar?

Estoy usando una SearchView en la barra de acción. Quiero utilizar la característica de autocompletar en la vista de búsqueda para obtener resultados de la base de datos.

es posible? ¿O necesito usar un cuadro de texto personalizado y luego añadir autocompletar a eso?

He usado AutoCompleteTextView personalizado y lo agrego en ActionBar.

enter image description here

public class MainActivity extends Activity { private static final String[] COUNTRIES = new String[] { "Belgium", "France", "France_", "Italy", "Germany", "Spain" }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ActionBar actionBar = getActionBar(); actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setDisplayShowCustomEnabled(true); // actionBar.setDisplayShowTitleEnabled(false); // actionBar.setIcon(R.drawable.ic_action_search); LayoutInflater inflator = (LayoutInflater) this .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View v = inflator.inflate(R.layout.actionbar, null); actionBar.setCustomView(v); ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_dropdown_item_1line, COUNTRIES); AutoCompleteTextView textView = (AutoCompleteTextView) v .findViewById(R.id.editText1); textView.setAdapter(adapter); } } 

y su diseño:

       

Editado:

Por favor revisa esto y este enlace puede ayudarte. el código está aquí.

Así que solo tuve que hacer esto para la versión v7 y me desanimé al descubrir que no puedo simplemente configurar el adaptador con un ArrayAdapter.

No quería usar un stock AutoCompleteTextView (como hace el comentarista superior aquí), porque entonces se está perdiendo una serie de características atractivas de SearchView, como el ícono de búsqueda pequeña y el botón x.

Así que extendí SearchView y obtuve esto:

 public class ArrayAdapterSearchView extends SearchView { private SearchView.SearchAutoComplete mSearchAutoComplete; public ArrayAdapterSearchView(Context context) { super(context); initialize(); } public ArrayAdapterSearchView(Context context, AttributeSet attrs) { super(context, attrs); initialize(); } public void initialize() { mSearchAutoComplete = (SearchAutoComplete) findViewById(android.support.v7.appcompat.R.id.search_src_text); this.setAdapter(null); this.setOnItemClickListener(null); } @Override public void setSuggestionsAdapter(CursorAdapter adapter) { // don't let anyone touch this } public void setOnItemClickListener(OnItemClickListener listener) { mSearchAutoComplete.setOnItemClickListener(listener); } public void setAdapter(ArrayAdapter adapter) { mSearchAutoComplete.setAdapter(adapter); } public void setText(String text) { mSearchAutoComplete.setText(text); } } 

Puedes usar esto en tu menú xml para ActionBar, así:

    

Es posible que también desee agregar funcionalidad de clic a la lista de autocompletar (por ejemplo, configurar el texto en EditText):

 MenuItem searchItem = menu.findItem(R.id.action_search); final ArrayAdapterSearchView searchView = (ArrayAdapterSearchView)searchItem.getActionView(); searchView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { searchView.setText(adapter.getItem(position).toString()); } }); 

Y aquí hay una versión similar para el antiguo android.widget.SearchView:

 public class ArrayAdapterSearchView extends SearchView { private AutoCompleteTextView mSearchAutoComplete; public ArrayAdapterSearchView(Context context) { super(context); initialize(); } public ArrayAdapterSearchView(Context context, AttributeSet attrs) { super(context, attrs); initialize(); } public void initialize() { mSearchAutoComplete = (AutoCompleteTextView) findViewById(getResources().getIdentifier("android:id/search_src_text", null, null)); setAutoCompleSuggestionsAdapter(null); setOnItemClickListener(null); } @Override public void setSuggestionsAdapter(CursorAdapter adapter) { throw new UnsupportedOperationException("Please use setAutoCompleSuggestionsAdapter(ArrayAdapter adapter) instead"); } public void setOnItemClickListener(AdapterView.OnItemClickListener listener) { mSearchAutoComplete.setOnItemClickListener(listener); } public void setAutoCompleSuggestionsAdapter(ArrayAdapter adapter) { mSearchAutoComplete.setAdapter(adapter); } public void setText(String text) { mSearchAutoComplete.setText(text); } } 

Aquí hay un método alternativo que usa CursorAdapter :

ExampleActivity.java

 private Menu menu; @Override @TargetApi(Build.VERSION_CODES.HONEYCOMB) public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.example, menu); this.menu = menu; if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { SearchManager manager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); SearchView search = (SearchView) menu.findItem(R.id.search).getActionView(); search.setSearchableInfo(manager.getSearchableInfo(getComponentName())); search.setOnQueryTextListener(new OnQueryTextListener() { @Override public boolean onQueryTextChange(String query) { loadHistory(query); return true; } }); } return true; } // History @TargetApi(Build.VERSION_CODES.HONEYCOMB) private void loadHistory(String query) { if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { Cursor cursor = db.rawQuery("SELECT * FROM items", null); // Example database query SearchManager manager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); final SearchView search = (SearchView) menu.findItem(R.id.search).getActionView(); search.setSearchableInfo(manager.getSearchableInfo(getComponentName())); search.setSuggestionsAdapter(new ExampleAdapter(this, cursor, items)); } } 

Ahora necesita crear un adaptador extendido desde CursorAdapter :

ExampleAdapter.java

 public class ExampleAdapter extends CursorAdapter { private List items; private TextView text; public ExampleAdapter(Context context, Cursor cursor, List items) { super(context, cursor, false); this.items = items; } @Override public void bindView(View view, Context context, Cursor cursor) { text.setText(cursor.getString(cursor.getColumnIndex("text"))); // Example column index } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.item, parent, false); text = (TextView) view.findViewById(R.id.text); return view; } } 

Tenga en cuenta que cuando importe CursorAdapter no importe la versión de soporte de Android, importe el android.widget.CursorAdapter estándar en su lugar.

El adaptador también requerirá un diseño personalizado:

res / layout / item.xml

    

Ahora puede personalizar los elementos de la lista agregando texto adicional o vistas de imágenes al diseño y rellenándolos con datos en el adaptador. Ahora necesita un elemento del menú SearchView:

res / menu / example.xml

    

Luego crea una configuración de búsqueda:

res / xml / searchable.xml

   

Finalmente agregue esto dentro de la etiqueta de actividad relevante en el archivo de manifiesto:

AndroidManifest.xml

      

Tenga en cuenta: la @string/search string utilizada en los ejemplos debe definirse en values ​​/ strings.xml , tampoco olvide actualizar la referencia a com.example para su proyecto.

Aquí está el tutorial original para referencia:

http://tpbapp.com/android-development/android-action-bar-searchview-tutorial

Sí, es posible. Cree una tabla (como en una base de datos SQLite) para sus sugerencias y formatee la tabla con las columnas requeridas.

Ver este enlace

También me enfrenté a este problema para la vista de búsqueda automática completa y la solucioné sin utilizar ningún diseño adicional y la vista de texto completa automáticamente, hay una clase llamada SearchAutoComplete . Utilicé esto para lograr la característica de autocompletar, simplemente coloque un adaptador de lista simple que contenga una lista de elementos para sugerir con la vista de búsqueda. Configure el adaptador en su SearchAutoComplete y la función de autocompletar funcionará a continuación es mi código. Recuerde que no tiene que agregar ningún diseño personalizado. Simplemente reemplace su método onCreateOptionsMenu (…) con el código de la mina:

  @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); MenuItem searchItem = menu.findItem(R.id.search); SearchView mSearchView = (SearchView) MenuItemCompat.getActionView(searchItem); SearchAutoComplete searchAutoComplete = (SearchAutoComplete) mSearchView.findViewById(android.support.v7.appcompat.R.id.search_src_text); ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_dropdown_item_1line, itemArrayList); searchAutoComplete.setAdapter(adapter); SearchManager searchManager = (SearchManager) getSystemService(this.SEARCH_SERVICE); mSearchView.setSearchableInfo( searchManager.getSearchableInfo(getComponentName())); return true; } 

Al hacer clic en el elemento sugerido, el elemento debería aparecer en la vista de búsqueda, así que agregue el código siguiente justo después de configurar el adaptador para buscar Autocompletar dentro del método onCreateOptionmenu (…)

  searchAutoComplete.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { // TODO Auto-generated method stub String searchString=(String)parent.getItemAtPosition(position); searchAutoComplete.setText(""+searchString); Toast.makeText(MainActivity.this, "you clicked "+searchString, Toast.LENGTH_LONG).show(); } }); 

Puede hacer esto con un CursorAdapter a través de algo como:

 MenuItem searchItem = menu.findItem(R.id.action_search); SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem); searchView.setSuggestionsAdapter(adapter);