Панель действий Android SearchView как автозаполнение?

Я использую SearchView в панели действий. Я хочу использовать функцию автозаполнения в окне поиска для получения результатов из базы данных.

Это возможно? Или мне нужно использовать настраиваемое текстовое поле, а затем добавить к нему автозаполнение?

У меня есть пользовательский AutoCompleteTextView и добавьте его в 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 adapter = new ArrayAdapter(this, android.R.layout.simple_dropdown_item_1line, COUNTRIES); AutoCompleteTextView textView = (AutoCompleteTextView) v .findViewById(R.id.editText1); textView.setAdapter(adapter); } } 

и ваш макет:

       

Отредактировано:

Проверьте это и эту ссылку, это может вам помочь. код здесь.

Поэтому я просто должен был сделать это для версии v7 и был в ужасе, обнаружив, что я не могу просто установить адаптер с помощью ArrayAdapter.

Я не хотел использовать запасной файл AutoCompleteTextView (как это делает верхний комментатор), потому что тогда вы упускаете из виду некоторые захватывающие функции SearchView, такие как маленький значок поиска и кнопка x.

Поэтому я расширил SearchView и получил следующее:

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

Вы можете использовать это в своем меню xml для ActionBar следующим образом:

    

Вы также можете добавить функциональность щелчка в список автозаполнения (например, установка текста в 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()); } }); 

И вот аналогичная версия для обычного старого 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); } } 

Вот альтернативный метод, использующий 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)); } } 

Теперь вам нужно создать адаптер, расширенный из 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; } } 

Обратите внимание: при импорте CursorAdapter не импортируйте версию поддержки Android, вместо этого импортируйте стандартный android.widget.CursorAdapter .

Адаптеру также потребуется настраиваемый макет:

разреш / макет / item.xml

    

Теперь вы можете настроить элементы списка, добавив в макет дополнительные текстовые или графические представления и заполнив их данными в адаптере. Теперь вам нужен элемент меню SearchView:

Рез / меню / example.xml

    

Затем создайте настраиваемую для поиска конфигурацию:

Рез / XML / searchable.xml

   

Наконец добавьте это внутри соответствующего тега активности в файле манифеста:

AndroidManifest.xml

      

Обратите внимание: @string/search используемая в примерах, должна быть определена в значениях / strings.xml , также не забудьте обновить ссылку на com.example для вашего проекта.

Вот исходный учебник для справки:

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

Да, это возможно. Создайте таблицу (например, в SQLiteDatabase) для своих предложений и отформатируйте таблицу с необходимыми столбцами.

См. Эту ссылку

Я также столкнулся с этой проблемой для автоматического полного поиска и исправил его без использования дополнительного макета и автоматического завершения текстового представления, есть class под названием SearchAutoComplete . Я использовал это для достижения автоматической функции, просто поместил простой адаптер списка, содержащий ArrayList элементов, предлагаемых с помощью вида поиска. Установите адаптер в SearchAutoComplete, и функция автозаполнения будет работать ниже, это мой код. Помните, что вам не нужно добавлять какие-либо пользовательские макеты. Просто замените метод onCreateOptionsMenu (…) с помощью моего кода:

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

Нажав на предлагаемый элемент, элемент должен появиться в представлении поиска, поэтому добавьте нижеприведенный код сразу после того, как вы установили адаптер в searchAutoComplete внутри метода 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(); } }); 

Вы можете сделать это с помощью CursorAdapter через что-то вроде:

 MenuItem searchItem = menu.findItem(R.id.action_search); SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem); searchView.setSuggestionsAdapter(adapter); 
  • Создание каталога не работает в Marshmallow Android
  • Android: Как установить уровень масштабирования вида карты в радиусе 1 км вокруг моего текущего местоположения?
  • Воспроизведение RTSP в приложении для Android
  • стиль андроида в коде
  • Внутренний class может получить доступ, но не обновлять значения - AsyncTask
  • Настройка Android с TextView для текста на иврите?
  • Android - Установить идентификатор fragmentа
  • Не удалось слияние манифеста: use-sdk: minSdkVersion 14
  • Android, обнаружение при запуске других приложений
  • перемещать текстовое представление только при открытии виртуальной клавиатуры на Android
  • Причина для активов и ресурсов в Android
  • Interesting Posts

    Создание дерева выражений в Prolog

    Невозможно установить «example.com» в качестве записи CNAME?

    Как объединить два файла PDF в один на Java?

    Как красиво печатать вложенные словари?

    Sony Vaio E14, обновленная до Windows 8.1, постоянно работает на поклоннике

    Никаких ограничений грамматики (DTD или XML-схемы), обнаруженных для документа

    Заполнение jQuery Mobile ListView с локальными данными JSON

    Создание библиотеки CMake, доступной для других пакетов CMake автоматически

    получение ng-объекта, выбранного с помощью ng-change

    как обновить таблицу с помощью параметров oledb?

    Как нарисовать трапецию / трапецию с css3?

    Как я могу перечислить все процессы, запущенные в Windows?

    В чем разница между литьем и использованием «как» в C #?

    Фиксирование копирования / вставки для сеансов подключения к удаленному рабочему столу

    Как использовать YamlPropertiesFactoryBean для загрузки файлов YAML с использованием Spring Framework 4.1?

    Давайте будем гением компьютера.