Loading api/current.xml +11 −0 Original line number Diff line number Diff line Loading @@ -204003,6 +204003,17 @@ synchronized="false" static="false" final="false" deprecated="deprecated" visibility="public" > </method> <method name="getCheckedItemIds" return="long[]" abstract="false" native="false" synchronized="false" static="false" final="false" deprecated="not deprecated" visibility="public" > core/java/android/util/LongSparseArray.java +22 −0 Original line number Diff line number Diff line Loading @@ -49,6 +49,28 @@ public class LongSparseArray<E> { mSize = 0; } /** * @return A copy of all keys contained in the sparse array. */ public long[] getKeys() { int length = mKeys.length; long[] result = new long[length]; System.arraycopy(mKeys, 0, result, 0, length); return result; } /** * Sets all supplied keys to the given unique value. * @param keys Keys to set * @param uniqueValue Value to set all supplied keys to */ public void setValues(long[] keys, E uniqueValue) { int length = keys.length; for (int i = 0; i < length; i++) { put(keys[i], uniqueValue); } } /** * Gets the Object mapped from the specified key, or <code>null</code> * if no such mapping has been made. Loading core/java/android/widget/ListView.java +88 −35 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import android.graphics.drawable.Drawable; import android.os.Parcel; import android.os.Parcelable; import android.util.AttributeSet; import android.util.LongSparseArray; import android.util.SparseBooleanArray; import android.view.FocusFinder; import android.view.KeyEvent; Loading Loading @@ -131,6 +132,7 @@ public class ListView extends AbsListView { private int mChoiceMode = CHOICE_MODE_NONE; private SparseBooleanArray mCheckStates; private LongSparseArray<Boolean> mCheckedIdStates; // used for temporary calculations. private final Rect mTempRect = new Rect(); Loading Loading @@ -464,6 +466,10 @@ public class ListView extends AbsListView { mCheckStates.clear(); } if (mCheckedIdStates != null) { mCheckedIdStates.clear(); } requestLayout(); } Loading Loading @@ -3310,9 +3316,14 @@ public class ListView extends AbsListView { */ public void setChoiceMode(int choiceMode) { mChoiceMode = choiceMode; if (mChoiceMode != CHOICE_MODE_NONE && mCheckStates == null) { if (mChoiceMode != CHOICE_MODE_NONE) { if (mCheckStates == null) { mCheckStates = new SparseBooleanArray(); } if (mCheckedIdStates == null && mAdapter.hasStableIds()) { mCheckedIdStates = new LongSparseArray<Boolean>(); } } } @Override Loading @@ -3323,13 +3334,24 @@ public class ListView extends AbsListView { handled = true; if (mChoiceMode == CHOICE_MODE_MULTIPLE) { boolean oldValue = mCheckStates.get(position, false); mCheckStates.put(position, !oldValue); boolean newValue = !mCheckStates.get(position, false); mCheckStates.put(position, newValue); if (mCheckedIdStates != null && mAdapter.hasStableIds()) { if (newValue) { mCheckedIdStates.put(mAdapter.getItemId(position), Boolean.TRUE); } else { boolean oldValue = mCheckStates.get(position, false); if (!oldValue) { mCheckedIdStates.delete(mAdapter.getItemId(position)); } } } else { boolean newValue = !mCheckStates.get(position, false); if (newValue) { mCheckStates.clear(); mCheckStates.put(position, true); if (mCheckedIdStates != null && mAdapter.hasStableIds()) { mCheckedIdStates.clear(); mCheckedIdStates.put(mAdapter.getItemId(position), Boolean.TRUE); } } } Loading Loading @@ -3358,16 +3380,30 @@ public class ListView extends AbsListView { if (mChoiceMode == CHOICE_MODE_MULTIPLE) { mCheckStates.put(position, value); if (mCheckedIdStates != null && mAdapter.hasStableIds()) { if (value) { mCheckedIdStates.put(mAdapter.getItemId(position), Boolean.TRUE); } else { mCheckedIdStates.delete(mAdapter.getItemId(position)); } } } else { boolean updateIds = mCheckedIdStates != null && mAdapter.hasStableIds(); // Clear all values if we're checking something, or unchecking the currently // selected item if (value || isItemChecked(position)) { mCheckStates.clear(); if (updateIds) { mCheckedIdStates.clear(); } } // this may end up selecting the value we just cleared but this way // we ensure length of mCheckStates is 1, a fact getCheckedItemPosition relies on if (value) { mCheckStates.put(position, true); if (updateIds) { mCheckedIdStates.put(mAdapter.getItemId(position), Boolean.TRUE); } } } Loading Loading @@ -3433,38 +3469,39 @@ public class ListView extends AbsListView { /** * Returns the set of checked items ids. The result is only valid if the * choice mode has not been set to {@link #CHOICE_MODE_SINGLE}. * choice mode has not been set to {@link #CHOICE_MODE_NONE}. * * @return A new array which contains the id of each checked item in the * list. * * @deprecated Use {@link #getCheckedItemIds()} instead. */ public long[] getCheckItemIds() { if (mChoiceMode != CHOICE_MODE_NONE && mCheckStates != null && mAdapter != null) { final SparseBooleanArray states = mCheckStates; final int count = states.size(); final long[] ids = new long[count]; final ListAdapter adapter = mAdapter; int checkedCount = 0; for (int i = 0; i < count; i++) { if (states.valueAt(i)) { ids[checkedCount++] = adapter.getItemId(states.keyAt(i)); return getCheckedItemIds(); } /** * Returns the set of checked items ids. The result is only valid if the * choice mode has not been set to {@link #CHOICE_MODE_NONE} and the adapter * has stable IDs. ({@link ListAdapter#hasStableIds()} == {@code true}) * * @return A new array which contains the id of each checked item in the * list. */ public long[] getCheckedItemIds() { if (mChoiceMode == CHOICE_MODE_NONE || mCheckedIdStates == null || mAdapter == null) { return new long[0]; } // Trim array if needed. mCheckStates may contain false values // resulting in checkedCount being smaller than count. if (checkedCount == count) { return ids; } else { final long[] result = new long[checkedCount]; System.arraycopy(ids, 0, result, 0, checkedCount); final LongSparseArray<Boolean> idStates = mCheckedIdStates; final int count = idStates.size(); final long[] ids = new long[count]; return result; } for (int i = 0; i < count; i++) { ids[i] = idStates.keyAt(i); } return new long[0]; return ids; } /** Loading @@ -3474,17 +3511,23 @@ public class ListView extends AbsListView { if (mCheckStates != null) { mCheckStates.clear(); } if (mCheckedIdStates != null) { mCheckedIdStates.clear(); } } static class SavedState extends BaseSavedState { SparseBooleanArray checkState; LongSparseArray<Boolean> checkIdState; /** * Constructor called from {@link ListView#onSaveInstanceState()} */ SavedState(Parcelable superState, SparseBooleanArray checkState) { SavedState(Parcelable superState, SparseBooleanArray checkState, LongSparseArray<Boolean> checkIdState) { super(superState); this.checkState = checkState; this.checkIdState = checkIdState; } /** Loading @@ -3493,12 +3536,19 @@ public class ListView extends AbsListView { private SavedState(Parcel in) { super(in); checkState = in.readSparseBooleanArray(); long[] idState = in.createLongArray(); if (idState.length > 0) { checkIdState = new LongSparseArray<Boolean>(); checkIdState.setValues(idState, Boolean.TRUE); } } @Override public void writeToParcel(Parcel out, int flags) { super.writeToParcel(out, flags); out.writeSparseBooleanArray(checkState); out.writeLongArray(checkIdState != null ? checkIdState.getKeys() : new long[0]); } @Override Loading @@ -3523,7 +3573,7 @@ public class ListView extends AbsListView { @Override public Parcelable onSaveInstanceState() { Parcelable superState = super.onSaveInstanceState(); return new SavedState(superState, mCheckStates); return new SavedState(superState, mCheckStates, mCheckedIdStates); } @Override Loading @@ -3536,5 +3586,8 @@ public class ListView extends AbsListView { mCheckStates = ss.checkState; } if (ss.checkIdState != null) { mCheckedIdStates = ss.checkIdState; } } } Loading
api/current.xml +11 −0 Original line number Diff line number Diff line Loading @@ -204003,6 +204003,17 @@ synchronized="false" static="false" final="false" deprecated="deprecated" visibility="public" > </method> <method name="getCheckedItemIds" return="long[]" abstract="false" native="false" synchronized="false" static="false" final="false" deprecated="not deprecated" visibility="public" >
core/java/android/util/LongSparseArray.java +22 −0 Original line number Diff line number Diff line Loading @@ -49,6 +49,28 @@ public class LongSparseArray<E> { mSize = 0; } /** * @return A copy of all keys contained in the sparse array. */ public long[] getKeys() { int length = mKeys.length; long[] result = new long[length]; System.arraycopy(mKeys, 0, result, 0, length); return result; } /** * Sets all supplied keys to the given unique value. * @param keys Keys to set * @param uniqueValue Value to set all supplied keys to */ public void setValues(long[] keys, E uniqueValue) { int length = keys.length; for (int i = 0; i < length; i++) { put(keys[i], uniqueValue); } } /** * Gets the Object mapped from the specified key, or <code>null</code> * if no such mapping has been made. Loading
core/java/android/widget/ListView.java +88 −35 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import android.graphics.drawable.Drawable; import android.os.Parcel; import android.os.Parcelable; import android.util.AttributeSet; import android.util.LongSparseArray; import android.util.SparseBooleanArray; import android.view.FocusFinder; import android.view.KeyEvent; Loading Loading @@ -131,6 +132,7 @@ public class ListView extends AbsListView { private int mChoiceMode = CHOICE_MODE_NONE; private SparseBooleanArray mCheckStates; private LongSparseArray<Boolean> mCheckedIdStates; // used for temporary calculations. private final Rect mTempRect = new Rect(); Loading Loading @@ -464,6 +466,10 @@ public class ListView extends AbsListView { mCheckStates.clear(); } if (mCheckedIdStates != null) { mCheckedIdStates.clear(); } requestLayout(); } Loading Loading @@ -3310,9 +3316,14 @@ public class ListView extends AbsListView { */ public void setChoiceMode(int choiceMode) { mChoiceMode = choiceMode; if (mChoiceMode != CHOICE_MODE_NONE && mCheckStates == null) { if (mChoiceMode != CHOICE_MODE_NONE) { if (mCheckStates == null) { mCheckStates = new SparseBooleanArray(); } if (mCheckedIdStates == null && mAdapter.hasStableIds()) { mCheckedIdStates = new LongSparseArray<Boolean>(); } } } @Override Loading @@ -3323,13 +3334,24 @@ public class ListView extends AbsListView { handled = true; if (mChoiceMode == CHOICE_MODE_MULTIPLE) { boolean oldValue = mCheckStates.get(position, false); mCheckStates.put(position, !oldValue); boolean newValue = !mCheckStates.get(position, false); mCheckStates.put(position, newValue); if (mCheckedIdStates != null && mAdapter.hasStableIds()) { if (newValue) { mCheckedIdStates.put(mAdapter.getItemId(position), Boolean.TRUE); } else { boolean oldValue = mCheckStates.get(position, false); if (!oldValue) { mCheckedIdStates.delete(mAdapter.getItemId(position)); } } } else { boolean newValue = !mCheckStates.get(position, false); if (newValue) { mCheckStates.clear(); mCheckStates.put(position, true); if (mCheckedIdStates != null && mAdapter.hasStableIds()) { mCheckedIdStates.clear(); mCheckedIdStates.put(mAdapter.getItemId(position), Boolean.TRUE); } } } Loading Loading @@ -3358,16 +3380,30 @@ public class ListView extends AbsListView { if (mChoiceMode == CHOICE_MODE_MULTIPLE) { mCheckStates.put(position, value); if (mCheckedIdStates != null && mAdapter.hasStableIds()) { if (value) { mCheckedIdStates.put(mAdapter.getItemId(position), Boolean.TRUE); } else { mCheckedIdStates.delete(mAdapter.getItemId(position)); } } } else { boolean updateIds = mCheckedIdStates != null && mAdapter.hasStableIds(); // Clear all values if we're checking something, or unchecking the currently // selected item if (value || isItemChecked(position)) { mCheckStates.clear(); if (updateIds) { mCheckedIdStates.clear(); } } // this may end up selecting the value we just cleared but this way // we ensure length of mCheckStates is 1, a fact getCheckedItemPosition relies on if (value) { mCheckStates.put(position, true); if (updateIds) { mCheckedIdStates.put(mAdapter.getItemId(position), Boolean.TRUE); } } } Loading Loading @@ -3433,38 +3469,39 @@ public class ListView extends AbsListView { /** * Returns the set of checked items ids. The result is only valid if the * choice mode has not been set to {@link #CHOICE_MODE_SINGLE}. * choice mode has not been set to {@link #CHOICE_MODE_NONE}. * * @return A new array which contains the id of each checked item in the * list. * * @deprecated Use {@link #getCheckedItemIds()} instead. */ public long[] getCheckItemIds() { if (mChoiceMode != CHOICE_MODE_NONE && mCheckStates != null && mAdapter != null) { final SparseBooleanArray states = mCheckStates; final int count = states.size(); final long[] ids = new long[count]; final ListAdapter adapter = mAdapter; int checkedCount = 0; for (int i = 0; i < count; i++) { if (states.valueAt(i)) { ids[checkedCount++] = adapter.getItemId(states.keyAt(i)); return getCheckedItemIds(); } /** * Returns the set of checked items ids. The result is only valid if the * choice mode has not been set to {@link #CHOICE_MODE_NONE} and the adapter * has stable IDs. ({@link ListAdapter#hasStableIds()} == {@code true}) * * @return A new array which contains the id of each checked item in the * list. */ public long[] getCheckedItemIds() { if (mChoiceMode == CHOICE_MODE_NONE || mCheckedIdStates == null || mAdapter == null) { return new long[0]; } // Trim array if needed. mCheckStates may contain false values // resulting in checkedCount being smaller than count. if (checkedCount == count) { return ids; } else { final long[] result = new long[checkedCount]; System.arraycopy(ids, 0, result, 0, checkedCount); final LongSparseArray<Boolean> idStates = mCheckedIdStates; final int count = idStates.size(); final long[] ids = new long[count]; return result; } for (int i = 0; i < count; i++) { ids[i] = idStates.keyAt(i); } return new long[0]; return ids; } /** Loading @@ -3474,17 +3511,23 @@ public class ListView extends AbsListView { if (mCheckStates != null) { mCheckStates.clear(); } if (mCheckedIdStates != null) { mCheckedIdStates.clear(); } } static class SavedState extends BaseSavedState { SparseBooleanArray checkState; LongSparseArray<Boolean> checkIdState; /** * Constructor called from {@link ListView#onSaveInstanceState()} */ SavedState(Parcelable superState, SparseBooleanArray checkState) { SavedState(Parcelable superState, SparseBooleanArray checkState, LongSparseArray<Boolean> checkIdState) { super(superState); this.checkState = checkState; this.checkIdState = checkIdState; } /** Loading @@ -3493,12 +3536,19 @@ public class ListView extends AbsListView { private SavedState(Parcel in) { super(in); checkState = in.readSparseBooleanArray(); long[] idState = in.createLongArray(); if (idState.length > 0) { checkIdState = new LongSparseArray<Boolean>(); checkIdState.setValues(idState, Boolean.TRUE); } } @Override public void writeToParcel(Parcel out, int flags) { super.writeToParcel(out, flags); out.writeSparseBooleanArray(checkState); out.writeLongArray(checkIdState != null ? checkIdState.getKeys() : new long[0]); } @Override Loading @@ -3523,7 +3573,7 @@ public class ListView extends AbsListView { @Override public Parcelable onSaveInstanceState() { Parcelable superState = super.onSaveInstanceState(); return new SavedState(superState, mCheckStates); return new SavedState(superState, mCheckStates, mCheckedIdStates); } @Override Loading @@ -3536,5 +3586,8 @@ public class ListView extends AbsListView { mCheckStates = ss.checkState; } if (ss.checkIdState != null) { mCheckedIdStates = ss.checkIdState; } } }