简体   繁体   中英

Java: How to disable button until even 1 RecyclerView items checkbox is checked?

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM