Как реализовать поиск по кнопкам?
я новенький в разработке приложений под Андроид, возникла следующая проблемка: Есть Activity, на нем присутствует компонент SearchView и ScrollView с кнопками. Каким образом можно реализовать по ним поиск и, если совпадений нет, отсеивание. Искал в интернете решения но повсюду варианты только с listview и массивами String. Пытался немного переписать найденные фрагменты под себя но безуспешно... Насколько я понимаю реализация должна выглядеть следующим образом - сделать массив кнопок, получить текст с каждой и сравнивать строку пользователя и текст. Если совпадений не найдено - кнопки выключать. Но как это прописать в коде я в связи с отсутствием опыта без понятия, если у вас есть варианты то поделитесь кусочком кода пожалуйста, буду премного благодарен :)
Ответы (3 шт):
Вы должны где-то иметь список ваших кнопок с тестами (по которым будет вестись список). Это так же могут быть и модели которые содержат этот текст и что-то ещё.
Используете RecyclerView. Вы можете написать в нем метод update который на вход будет принимать список с моделями для отображения ваших кнопок. Фильтровать вам необходимо его где-то снаружи RecyclerView, а в RecyclerView передавать готовый список.
Для того чтоб всякий раз не обновлять весь RecyclerView используйте DiffUtils, он позволит изменить только те элементы вашего RecyclerView, которые изменились.
Я согласен с ответом @Сергей Бувака. Ниже я опишу альтернативное решение, которое для Вас может оказаться проще на начальных этапах.
Если Вы хотите использовать ScrollView, то у Вас где-то должен храниться массив кнопок. Его можно найти в onCreate(), например, с помощью этого кода:
for(int index=0; index<((ViewGroup)viewGroup).getChildCount(); ++index) {
View nextChild = ((ViewGroup)viewGroup).getChildAt(index);
}
При поиске пробегаетесь по каждому элементу списка и проверяете условие фильтрации. Если кнопка проходит фильтрацию - вызываете
button.visibility = View.VISIBLE;
иначе
button.visibility = View.GONE;
@Виталий Перятин Смотрите сделал следующее:
в onCreate() создал массив кнопок таким образом(надеюсь это правильно)
Button[] buttonArray = {
(Button) findViewById(R.id.knms11),
(Button) findViewById(R.id.knms12),
(Button) findViewById(R.id.knms21),
(Button) findViewById(R.id.knms22),
(Button) findViewById(R.id.knms31),
(Button) findViewById(R.id.knms41),
(Button) findViewById(R.id.mkms11),
(Button) findViewById(R.id.mkms21),
(Button) findViewById(R.id.mkms22),
(Button) findViewById(R.id.mkms31),
(Button) findViewById(R.id.fbms11),
(Button) findViewById(R.id.fbms21),
(Button) findViewById(R.id.fbms31)};
После чего создал методы для отображения SearchView и нажатие кнопки поиска/ввода текста:
public boolean onCreateOptionsMenu (Menu menu){
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.students_search, menu);
MenuItem searchViewItem = menu.findItem(R.id.StudentsSearch);
final SearchView searchView = (SearchView)
MenuItemCompat.getActionView(searchViewItem);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
searchView.clearFocus();
if(*условие*){
button.visibility = View.VISIBLE;
}else{
button.visibility = View.GONE;
Toast.makeText(studentsActivity.this, "No Match found",Toast.LENGTH_LONG).show();
}
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
});
return super.onCreateOptionsMenu(menu);
}
Вопрос теперь в том что нужно прописать в условиях в методах onQueryTextSubmit и onQueryTextChange и как мне передавать текст с кнопки что-бы при поиске кнопки могли отфильтровываться?