I need to get my button to be disabled until the user checks a checkbox in RecyclerView.
My checkboxes are inside a RecyclerView and button is outside of it.
This solved the problem: (I put the code which ONLY considers parts of this particular case)
Adapter:
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);
}
});
Activity:
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);
}
}
});
First I tried to do Adapter part into the constructor, which obviously didn't work, then I only copy-pasted that same if-else from constructor into the holder, then it started working.
The easiest way to handle this situation is to make global variable int checkedItems = 0;
in your adapter, and every time item is checked you do checkedItems++;
or if it is not checkedItems--;
. Now you need to tell that change to your activity. So in adapter you define interface for example
public interface OnItemsCheckStateListener {
void onItemCheckStateChanged(int checkedItemCounter);
}
You will have to implement this interface into your activity, and define if (checkedItemCounter == 0) disable button, else enable it. Then you need pass that instance into adapter. So in adapter make global private OnItemsCheckStateListener checkStateListener;
and setter (which will be called from activity)
public void setOnItemsCheckStateListener(OnItemsCheckStateListener checkStateListener) {
this.checkStateListener = checkStateListener;
}
Et the end after every increment or decrement of checkedItems, you need to trigger checkStateListener.onItemCheckStateChanged(checkedItems);
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.