Мне нужно, чтобы моя кнопка была отключена, пока пользователь не установит флажок в 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 из конструктора в держатель, после чего он начал работать.




Самый простой способ справиться с этой ситуацией — сделать глобальную переменную 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);
Я изменил свой пост, который включает в себя ваши предложения, но мне все еще не удалось заставить его работать, так что мне еще нужно сделать или изменить?
Вы переопределили эти функции в своем адаптере: onCreateViewHolder (родитель ViewGroup, int viewType), onBindViewHolder (держатель ViewHolder, позиция int), getItemCount()? Я имею в виду, вам все еще нужно создать обычный адаптер, и вам нужно добавить весь тот код, который вы вставили сюда, в обычный адаптер.
У меня нет другого адаптера, это тот, где есть все остальное, я просто вставил код, который считает только эту конкретную проблему миром
Я заставил это работать сейчас, спасибо за вашу помощь m8, если вам интересно, как я это решил, я изменил свой пост, чтобы увидеть финальную версию, еще раз спасибо за вашу помощь!
О, здорово, рад, что смог помочь
Ваш адаптер может отслеживать, выбраны ли какие-либо элементы, а затем уведомлять фрагмент или действие с помощью кнопки об изменениях. Разместите свой код, чтобы предоставить больше информации о деле