studio android autocomplete autocompletetextview searchview

studio - Android Action Bar SearchView como Autocompletar?



autocomplete android studio (6)

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?


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<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 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

<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 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

<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>

Luego crea 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 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


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í:

<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>

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); } }


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);


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<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 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(); } });


He usado AutoCompleteTextView personalizado y lo agrego en ActionBar.

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 revisa this y este link puede ayudarte. el código está aquí.