Java Code Examples for android.support.v7.widget.RecyclerView.Adapter#hasStableIds()

The following examples show how to use android.support.v7.widget.RecyclerView.Adapter#hasStableIds() . You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: ItemSelectionSupport.java    From MultiView with Apache License 2.0 6 votes vote down vote up
/**
 * Defines the choice behavior for the List. By default, Lists do not have any choice behavior
 * ({@link ChoiceMode#NONE}). By setting the choiceMode to {@link ChoiceMode#SINGLE}, the
 * List allows up to one item to  be in a chosen state. By setting the choiceMode to
 * {@link ChoiceMode#MULTIPLE}, the list allows any number of items to be chosen.
 *
 * @param choiceMode One of {@link ChoiceMode#NONE}, {@link ChoiceMode#SINGLE}, or
 *                   {@link ChoiceMode#MULTIPLE}
 */
public void setChoiceMode(ChoiceMode choiceMode) {
    if (mChoiceMode == choiceMode) {
        return;
    }

    mChoiceMode = choiceMode;

    if (mChoiceMode != ChoiceMode.NONE) {
        if (mCheckedStates == null) {
            mCheckedStates = new CheckedStates();
        }

        final Adapter adapter = mRecyclerView.getAdapter();
        if (mCheckedIdStates == null && adapter != null && adapter.hasStableIds()) {
            mCheckedIdStates = new CheckedIdStates();
        }
    }
}
 
Example 2
Source File: ItemSelectionSupport.java    From UltimateAndroid with Apache License 2.0 6 votes vote down vote up
/**
 * Defines the choice behavior for the List. By default, Lists do not have any choice behavior
 * ({@link com.marshalchen.common.uimodule.twowayview.ItemSelectionSupport.ChoiceMode#NONE}). By setting the choiceMode to {@link com.marshalchen.common.uimodule.twowayview.ItemSelectionSupport.ChoiceMode#SINGLE}, the
 * List allows up to one item to  be in a chosen state. By setting the choiceMode to
 * {@link com.marshalchen.common.uimodule.twowayview.ItemSelectionSupport.ChoiceMode#MULTIPLE}, the list allows any number of items to be chosen.
 *
 * @param choiceMode One of {@link com.marshalchen.common.uimodule.twowayview.ItemSelectionSupport.ChoiceMode#NONE}, {@link com.marshalchen.common.uimodule.twowayview.ItemSelectionSupport.ChoiceMode#SINGLE}, or
 * {@link com.marshalchen.common.uimodule.twowayview.ItemSelectionSupport.ChoiceMode#MULTIPLE}
 */
public void setChoiceMode(ChoiceMode choiceMode) {
    if (mChoiceMode == choiceMode) {
        return;
    }

    mChoiceMode = choiceMode;

    if (mChoiceMode != ChoiceMode.NONE) {
        if (mCheckedStates == null) {
            mCheckedStates = new CheckedStates();
        }

        final Adapter adapter = mRecyclerView.getAdapter();
        if (mCheckedIdStates == null && adapter != null && adapter.hasStableIds()) {
            mCheckedIdStates = new CheckedIdStates();
        }
    }
}
 
Example 3
Source File: ItemSelectionSupport.java    From MultiView with Apache License 2.0 4 votes vote down vote up
/**
 * Sets the checked state of the specified position. The is only valid if
 * the choice mode has been set to {@link ChoiceMode#SINGLE} or
 * {@link ChoiceMode#MULTIPLE}.
 *
 * @param position The item whose checked state is to be checked
 * @param checked  The new checked state for the item
 */
public void setItemChecked(int position, boolean checked) {
    if (mChoiceMode == ChoiceMode.NONE) {
        return;
    }

    final Adapter adapter = mRecyclerView.getAdapter();

    if (mChoiceMode == ChoiceMode.MULTIPLE) {
        boolean oldValue = mCheckedStates.get(position);
        mCheckedStates.put(position, checked);

        if (mCheckedIdStates != null && adapter.hasStableIds()) {
            if (checked) {
                mCheckedIdStates.put(adapter.getItemId(position), position);
            } else {
                mCheckedIdStates.delete(adapter.getItemId(position));
            }
        }

        if (oldValue != checked) {
            if (checked) {
                mCheckedCount++;
            } else {
                mCheckedCount--;
            }
        }
    } else {
        boolean updateIds = mCheckedIdStates != null && adapter.hasStableIds();

        // Clear all values if we're checking something, or unchecking the currently
        // selected item
        if (checked || isItemChecked(position)) {
            mCheckedStates.clear();

            if (updateIds) {
                mCheckedIdStates.clear();
            }
        }

        // This may end up selecting the checked we just cleared but this way
        // we ensure length of mCheckStates is 1, a fact getCheckedItemPosition relies on
        if (checked) {
            mCheckedStates.put(position, true);

            if (updateIds) {
                mCheckedIdStates.put(adapter.getItemId(position), position);
            }

            mCheckedCount = 1;
        } else if (mCheckedStates.size() == 0 || !mCheckedStates.valueAt(0)) {
            mCheckedCount = 0;
        }
    }

    updateOnScreenCheckedViews();
}
 
Example 4
Source File: ItemSelectionSupport.java    From MultiView with Apache License 2.0 4 votes vote down vote up
public void onAdapterDataChanged() {
    final Adapter adapter = mRecyclerView.getAdapter();
    if (mChoiceMode == ChoiceMode.NONE || adapter == null || !adapter.hasStableIds()) {
        return;
    }

    final int itemCount = adapter.getItemCount();

    // Clear out the positional check states, we'll rebuild it below from IDs.
    mCheckedStates.clear();

    for (int checkedIndex = 0; checkedIndex < mCheckedIdStates.size(); checkedIndex++) {
        final long currentId = mCheckedIdStates.keyAt(checkedIndex);
        final int currentPosition = mCheckedIdStates.valueAt(checkedIndex);

        final long newPositionId = adapter.getItemId(currentPosition);
        if (currentId != newPositionId) {
            // Look around to see if the ID is nearby. If not, uncheck it.
            final int start = Math.max(0, currentPosition - CHECK_POSITION_SEARCH_DISTANCE);
            final int end = Math.min(currentPosition + CHECK_POSITION_SEARCH_DISTANCE, itemCount);

            boolean found = false;
            for (int searchPos = start; searchPos < end; searchPos++) {
                final long searchId = adapter.getItemId(searchPos);
                if (currentId == searchId) {
                    found = true;
                    mCheckedStates.put(searchPos, true);
                    mCheckedIdStates.setValueAt(checkedIndex, searchPos);
                    break;
                }
            }

            if (!found) {
                mCheckedIdStates.delete(currentId);
                mCheckedCount--;
                checkedIndex--;
            }
        } else {
            mCheckedStates.put(currentPosition, true);
        }
    }
}
 
Example 5
Source File: ItemSelectionSupport.java    From UltimateAndroid with Apache License 2.0 4 votes vote down vote up
/**
 * Sets the checked state of the specified position. The is only valid if
 * the choice mode has been set to {@link com.marshalchen.common.uimodule.twowayview.ItemSelectionSupport.ChoiceMode#SINGLE} or
 * {@link com.marshalchen.common.uimodule.twowayview.ItemSelectionSupport.ChoiceMode#MULTIPLE}.
 *
 * @param position The item whose checked state is to be checked
 * @param checked The new checked state for the item
 */
public void setItemChecked(int position, boolean checked) {
    if (mChoiceMode == ChoiceMode.NONE) {
        return;
    }

    final Adapter adapter = mRecyclerView.getAdapter();

    if (mChoiceMode == ChoiceMode.MULTIPLE) {
        boolean oldValue = mCheckedStates.get(position);
        mCheckedStates.put(position, checked);

        if (mCheckedIdStates != null && adapter.hasStableIds()) {
            if (checked) {
                mCheckedIdStates.put(adapter.getItemId(position), position);
            } else {
                mCheckedIdStates.delete(adapter.getItemId(position));
            }
        }

        if (oldValue != checked) {
            if (checked) {
                mCheckedCount++;
            } else {
                mCheckedCount--;
            }
        }
    } else {
        boolean updateIds = mCheckedIdStates != null && adapter.hasStableIds();

        // Clear all values if we're checking something, or unchecking the currently
        // selected item
        if (checked || isItemChecked(position)) {
            mCheckedStates.clear();

            if (updateIds) {
                mCheckedIdStates.clear();
            }
        }

        // This may end up selecting the checked we just cleared but this way
        // we ensure length of mCheckStates is 1, a fact getCheckedItemPosition relies on
        if (checked) {
            mCheckedStates.put(position, true);

            if (updateIds) {
                mCheckedIdStates.put(adapter.getItemId(position), position);
            }

            mCheckedCount = 1;
        } else if (mCheckedStates.size() == 0 || !mCheckedStates.valueAt(0)) {
            mCheckedCount = 0;
        }
    }

    updateOnScreenCheckedViews();
}
 
Example 6
Source File: ItemSelectionSupport.java    From UltimateAndroid with Apache License 2.0 4 votes vote down vote up
public void onAdapterDataChanged() {
    final Adapter adapter = mRecyclerView.getAdapter();
    if (mChoiceMode == ChoiceMode.NONE || adapter == null || !adapter.hasStableIds()) {
        return;
    }

    final int itemCount = adapter.getItemCount();

    // Clear out the positional check states, we'll rebuild it below from IDs.
    mCheckedStates.clear();

    for (int checkedIndex = 0; checkedIndex < mCheckedIdStates.size(); checkedIndex++) {
        final long currentId = mCheckedIdStates.keyAt(checkedIndex);
        final int currentPosition = mCheckedIdStates.valueAt(checkedIndex);

        final long newPositionId = adapter.getItemId(currentPosition);
        if (currentId != newPositionId) {
            // Look around to see if the ID is nearby. If not, uncheck it.
            final int start = Math.max(0, currentPosition - CHECK_POSITION_SEARCH_DISTANCE);
            final int end = Math.min(currentPosition + CHECK_POSITION_SEARCH_DISTANCE, itemCount);

            boolean found = false;
            for (int searchPos = start; searchPos < end; searchPos++) {
                final long searchId = adapter.getItemId(searchPos);
                if (currentId == searchId) {
                    found = true;
                    mCheckedStates.put(searchPos, true);
                    mCheckedIdStates.setValueAt(checkedIndex, searchPos);
                    break;
                }
            }

            if (!found) {
                mCheckedIdStates.delete(currentId);
                mCheckedCount--;
                checkedIndex--;
            }
        } else {
            mCheckedStates.put(currentPosition, true);
        }
    }
}