Example usage for android.widget Adapter hasStableIds

List of usage examples for android.widget Adapter hasStableIds

Introduction

In this page you can find the example usage for android.widget Adapter hasStableIds.

Prototype

boolean hasStableIds();

Source Link

Document

Indicates whether the item ids are stable across changes to the underlying data.

Usage

From source file:co.codecrunch.musicplayerlite.recyclerviewutils.ItemSelectionSupport.java

/**
 * 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}// w ww.  j  ava  2  s .c  o  m
 */
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();
        }
    }
}

From source file:co.codecrunch.musicplayerlite.recyclerviewutils.ItemSelectionSupport.java

public void onAdapterDataChanged() {
    final Adapter adapter = mRecyclerView.getAdapter();
    if (mChoiceMode == ChoiceMode.NONE || adapter == null || !adapter.hasStableIds()) {
        return;//ww  w  . j  a  v a  2s .  c o  m
    }

    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);
        }
    }
}

From source file:co.codecrunch.musicplayerlite.recyclerviewutils.ItemSelectionSupport.java

/**
 * 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}.//  ww  w  .j av  a  2  s.c o  m
 *
 * @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();
}