Как реализовать поиск по кнопкам?

я новенький в разработке приложений под Андроид, возникла следующая проблемка: Есть Activity, на нем присутствует компонент SearchView и ScrollView с кнопками. Каким образом можно реализовать по ним поиск и, если совпадений нет, отсеивание. Искал в интернете решения но повсюду варианты только с listview и массивами String. Пытался немного переписать найденные фрагменты под себя но безуспешно... Насколько я понимаю реализация должна выглядеть следующим образом - сделать массив кнопок, получить текст с каждой и сравнивать строку пользователя и текст. Если совпадений не найдено - кнопки выключать. Но как это прописать в коде я в связи с отсутствием опыта без понятия, если у вас есть варианты то поделитесь кусочком кода пожалуйста, буду премного благодарен :)


Ответы (3 шт):

Автор решения: Sergei Buvaka

Вы должны где-то иметь список ваших кнопок с тестами (по которым будет вестись список). Это так же могут быть и модели которые содержат этот текст и что-то ещё.

Используете 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;
→ Ссылка
Автор решения: Dean Winchester

@Виталий Перятин Смотрите сделал следующее: в 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 и как мне передавать текст с кнопки что-бы при поиске кнопки могли отфильтровываться?

→ Ссылка