Merge "AbsListView invalidates data when it isn’t changed"
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index 9561f08..df84970 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -1036,6 +1036,7 @@
mChoiceActionMode = startActionMode(mMultiChoiceModeCallback);
}
+ final boolean itemCheckChanged;
if (mChoiceMode == CHOICE_MODE_MULTIPLE || mChoiceMode == CHOICE_MODE_MULTIPLE_MODAL) {
boolean oldValue = mCheckStates.get(position);
mCheckStates.put(position, value);
@@ -1046,7 +1047,8 @@
mCheckedIdStates.delete(mAdapter.getItemId(position));
}
}
- if (oldValue != value) {
+ itemCheckChanged = oldValue != value;
+ if (itemCheckChanged) {
if (value) {
mCheckedItemCount++;
} else {
@@ -1062,6 +1064,7 @@
boolean updateIds = mCheckedIdStates != null && mAdapter.hasStableIds();
// Clear all values if we're checking something, or unchecking the currently
// selected item
+ itemCheckChanged = isItemChecked(position) != value;
if (value || isItemChecked(position)) {
mCheckStates.clear();
if (updateIds) {
@@ -1081,8 +1084,8 @@
}
}
- // Do not generate a data change while we are in the layout phase
- if (!mInLayout && !mBlockLayoutRequests) {
+ // Do not generate a data change while we are in the layout phase or data has not changed
+ if (!mInLayout && !mBlockLayoutRequests && itemCheckChanged) {
mDataChanged = true;
rememberSyncState();
requestLayout();