Java: как отключить кнопку, пока не будет установлен флажок хотя бы для 1 элемента RecyclerView?

Мне нужно, чтобы моя кнопка была отключена, пока пользователь не установит флажок в RecyclerView.

Мои флажки находятся внутри RecyclerView, а кнопка - за его пределами.

Это решило проблему: (Я помещаю код, который ТОЛЬКО рассматривает части этого конкретного случая)

Адаптер:

public class NewGamePlayerAdapter extends RecyclerView.Adapter<NewGamePlayerAdapter.NewGamePlayerViewHolder> {
    private ArrayList<NewGamePlayerItem> mNewGamePlayerList;
    private OnItemsCheckStateListener checkStateListener;

    private int checkedItems = 0;

    public interface OnItemsCheckStateListener {
        void onItemCheckStateChanged(int checkedItemCounter);
    }

    public void setOnItemsCheckStateListener(OnItemsCheckStateListener checkStateListener) {
        this.checkStateListener = checkStateListener;
    }


 @Override
    public void onBindViewHolder(@NonNull final NewGamePlayerViewHolder holder, final int position) {
        final NewGamePlayerItem currentItem = mNewGamePlayerList.get(position);

        /** In some cases, this will prevent unwanted situations **/
        holder.mCheckBox.setOnCheckedChangeListener(null);

        /** If true, checkbox will be selected, else unselected **/
        holder.mCheckBox.setChecked(currentItem.getCheckBox());

        holder.mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            /** set object's last status **/
            currentItem.setSelected(isChecked);

            if (isChecked) {
                checkedItems++;
            } else {
                checkedItems--;
            }

            checkStateListener.onItemCheckStateChanged(checkedItems);
        }
    });

Деятельность:

mAdapter.setOnItemsCheckStateListener(new NewGamePlayerAdapter.OnItemsCheckStateListener() {
            @Override
            public void onItemCheckStateChanged(int checkedItemCounter) {
                mNext = findViewById(R.id.button_next);

                if (checkedItemCounter == 0) {
                    mNext.setEnabled(false);
                } else {
                    mNext.setEnabled(true);
                }
            }
        });

Сначала я попытался сделать часть адаптера в конструкторе, что явно не сработало, затем я только скопировал-вставил тот же самый if-else из конструктора в держатель, после чего он начал работать.

Ваш адаптер может отслеживать, выбраны ли какие-либо элементы, а затем уведомлять фрагмент или действие с помощью кнопки об изменениях. Разместите свой код, чтобы предоставить больше информации о деле

S-Sh 20.07.2019 19:50
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
131
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Самый простой способ справиться с этой ситуацией — сделать глобальную переменную int checkedItems = 0; в вашем адаптере, и каждый раз, когда элемент проверяется, вы делаете checkedItems++; или, если это не так, checkedItems--;. Теперь вам нужно сообщить об этом изменении в вашей деятельности. Итак, в адаптере вы определяете интерфейс, например

public interface OnItemsCheckStateListener {
    void onItemCheckStateChanged(int checkedItemCounter);
} 

Вам нужно будет внедрить этот интерфейс в свою деятельность и определить, если (checkedItemCounter == 0) отключить кнопку, иначе включить ее. Затем вам нужно передать этот экземпляр в адаптер. Итак, в адаптере сделайте глобальный private OnItemsCheckStateListener checkStateListener; и сеттер (который будет вызываться из активности)

public void setOnItemsCheckStateListener(OnItemsCheckStateListener checkStateListener) {
    this.checkStateListener = checkStateListener;
}

В конце после каждого увеличения или уменьшения числа checkedItems вам нужно запускать checkStateListener.onItemCheckStateChanged(checkedItems);

Я изменил свой пост, который включает в себя ваши предложения, но мне все еще не удалось заставить его работать, так что мне еще нужно сделать или изменить?

antsakontsa 21.07.2019 09:35

Вы переопределили эти функции в своем адаптере: onCreateViewHolder (родитель ViewGroup, int viewType), onBindViewHolder (держатель ViewHolder, позиция int), getItemCount()? Я имею в виду, вам все еще нужно создать обычный адаптер, и вам нужно добавить весь тот код, который вы вставили сюда, в обычный адаптер.

Ban Markovic 21.07.2019 11:24

У меня нет другого адаптера, это тот, где есть все остальное, я просто вставил код, который считает только эту конкретную проблему миром

antsakontsa 22.07.2019 07:20

Я заставил это работать сейчас, спасибо за вашу помощь m8, если вам интересно, как я это решил, я изменил свой пост, чтобы увидеть финальную версию, еще раз спасибо за вашу помощь!

antsakontsa 22.07.2019 07:50

О, здорово, рад, что смог помочь

Ban Markovic 22.07.2019 08:51

Другие вопросы по теме