Barra de Acción Android SearchView as Autocomplete?

Estoy utilizando un SearchView en la barra de acción. Quiero utilizar la función 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 agregar autocompletar a eso?

Tengo uso AutoCompleteTextView de encargo y lo agrego en ActionBar.

Introduzca aquí la descripción de la imagen

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<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, COUNTRIES); AutoCompleteTextView textView = (AutoCompleteTextView) v .findViewById(R.id.editText1); textView.setAdapter(adapter); } } 

Y su diseño:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Action Bar:" android:textAppearance="?android:attr/textAppearanceMedium" android:textColor="#FFFFFF" /> <AutoCompleteTextView android:id="@+id/editText1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:ems="10" android:imeOptions="actionSearch" android:inputType="textAutoComplete|textAutoCorrect" android:textColor="#FFFFFF" > <requestFocus /> </AutoCompleteTextView> </LinearLayout> 

Editado:

Por favor, compruebe esto y este enlace puede ayudarle. Código está aquí.

Así que sólo tenía que hacer esto para la versión v7 y se consternó al descubrir que no puedo simplemente configurar el adaptador con un ArrayAdapter.

No quería usar un AutoCompleteTextView de stock (como lo hace el comentarista superior aquí), porque entonces te estás perdiendo una serie de atractivas características de SearchView, como el pequeño icono de búsqueda 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); } } 

Usted puede utilizar esto en su xml del menú para el ActionBar así:

 <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" > <item android:id="@+id/action_search" android:icon="@android:drawable/ic_menu_add" android:title="TITLE" app:actionViewClass="com.yourpackage.ArrayAdapterSearchView" app:showAsAction="ifRoom|collapseActionView"/> </menu> 

También puede agregar funcionalidad de clic a la lista de autocompletar (por ejemplo, establecer el texto en el EditText):

 MenuItem searchItem = menu.findItem(R.id.action_search); final ArrayAdapterSearchView searchView = (ArrayAdapterSearchView) MenuItemCompat.getActionView(searchItem); 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); } } 

He aquí un método alternativo usando CursorAdapter :

EjemploActividad.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<String> items; private TextView text; public ExampleAdapter(Context context, Cursor cursor, List<String> 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: al importar 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

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:id="@+id/item" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout> 

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

Res / menu / example.xml

 <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/search" android:title="@string/search" android:showAsAction="ifRoom" android:actionViewClass="android.widget.SearchView" /> </menu> 

A continuación, cree una configuración de búsqueda:

Res / xml / searchable.xml

 <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/search" android:hint="@string/search" > </searchable> 

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

AndroidManifest.xml

 <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> <meta-data android:name="android.app.default_searchable" android:value="com.example.ExampleActivity" /> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" /> 

Tenga en cuenta: La @string/search utilizada en los ejemplos debe definirse en valores / strings.xml , también no 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 necesarias.

Ver este enlace

También me enfrentaba a este problema para la vista de búsqueda automática completa y arreglarlo sin usar ningún diseño adicional y la vista automática de texto completo, hay una clase llamada SearchAutoComplete . Utilicé esto para lograr la característica de auto completo, sólo tiene que poner un adaptador de lista simple que contienen un ArrayList de elementos para sugerir con la vista de búsqueda. Establecer el adaptador a su SearchAutoComplete y la función automática completa 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 código de 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<String> adapter = new ArrayAdapter<String>(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 debe aparecer en la vista de búsqueda, añada el siguiente código justo después de configurar el adaptador para searchAutoComplete 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 hacerlo 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); 
  • Android Support Library ActionBar no funciona en el dispositivo 2.3
  • Buscar sugerencias de diferentes tablas en diferentes actividades
  • SearchView en AppCompat distorsiona el icono
  • Cambiar TextColor en SearchView mediante la barra de herramientas de Android
  • Eliminar el relleno de Android SearchView cuando se amplía
  • SearchView en OptionsMenu no es el ancho completo
  • Cómo utilizar onQueryTextChange con muchos fragmentos
  • NoSuchMethodError al llamar a MenuItem.collapseActionView
  • No se puede mostrar el teclado automáticamente en el SearchView
  • Adición de SearchView en el fragmento
  • Cómo manejar el botón Atrás de la vista de búsqueda en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.