public void onClick(RecyclerView.ViewHolder vh) {
        if (mChoiceMode == AbsListView.CHOICE_MODE_NONE)
            return;

        int checkedItemCount = mCheckStates.size();
        int position = vh.getAdapterPosition();

        if (position == RecyclerView.NO_POSITION) {
            Log.d(LOG_TAG, "Unable to Set Item State");
            return;
        }

        switch (mChoiceMode) {
            case AbsListView.CHOICE_MODE_NONE:
                break;
            case AbsListView.CHOICE_MODE_SINGLE: {
                boolean checked = mCheckStates.get(position, false);
                if (!checked) {
                    for (int i = 0; i < checkedItemCount; i++) {
                        mAdapter.notifyItemChanged(mCheckStates.keyAt(i));
                    }
                    mCheckStates.clear();
                    mCheckStates.put(position, true);
                    mCheckedIdStates.clear();
                    mCheckedIdStates.put(mAdapter.getItemId(position), position);
                }
                // We directly call onBindViewHolder here because notifying that an item has
                // changed on an item that has the focus causes it to lose focus, which makes
                // keyboard navigation a bit annoying
                mAdapter.onBindViewHolder(vh, position);
                break;
            }
            case AbsListView.CHOICE_MODE_MULTIPLE: {
                boolean checked = mCheckStates.get(position, false);
                mCheckStates.put(position, !checked);
                // We directly call onBindViewHolder here because notifying that an item has
                // changed on an item that has the focus causes it to lose focus, which makes
                // keyboard navigation a bit annoying
                mAdapter.onBindViewHolder(vh, position);
                break;
            }
            case AbsListView.CHOICE_MODE_MULTIPLE_MODAL: {
                throw new RuntimeException("Multiple Modal not implemented in ItemChoiceManager.");
            }
        }
    }
Running state of which IDs are currently checked.
If there is a value for a given key, the checked state for that ID is true
and the value holds the last known position in the adapter for that id.
app/src/main/java/com/example/android/sunshine/app/ItemChoiceManager.java