List of usage examples for android.widget Adapter hasStableIds
boolean hasStableIds();
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(); }