am e9bb596c: Merge "Synchronize selected item data on-demand after data set invalidation" into mnc-dev

* commit 'e9bb596cc878281be209952f1cce886be75cd146':
  Synchronize selected item data on-demand after data set invalidation
This commit is contained in:
Alan Viverette
2015-06-03 23:32:24 +00:00
committed by Android Git Automerger
2 changed files with 56 additions and 10 deletions

View File

@@ -5308,6 +5308,13 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
}
}
@Override
void syncSelectedItem() {
if (mDataChanged) {
layoutChildren();
}
}
@Override
protected void handleDataChanged() {
int count = mItemCount;

View File

@@ -551,37 +551,67 @@ public abstract class AdapterView<T extends Adapter> extends ViewGroup {
}
/**
* Return the position of the currently selected item within the adapter's data set
* Returns the position of the currently selected item within the adapter's
* data set, or {@link #INVALID_POSITION} if there is nothing selected.
* <p>
* <strong>Note:</strong> Prior to {@link android.os.Build.VERSION_CODES#MNC},
* calling this method between an adapter data set change and a subsequent
* layout pass could return invalid data.
*
* @return int Position (starting at 0), or {@link #INVALID_POSITION} if there is nothing selected.
* @return the selected item's position (starting at 0), or
* {@link #INVALID_POSITION} if there is nothing selected
*/
@ViewDebug.CapturedViewProperty
public int getSelectedItemPosition() {
syncSelectedItem();
return mNextSelectedPosition;
}
/**
* @return The id corresponding to the currently selected item, or {@link #INVALID_ROW_ID}
* if nothing is selected.
* Returns the row ID corresponding to the currently selected item, or
* {@link #INVALID_ROW_ID} if nothing is selected.
* <p>
* <strong>Note:</strong> Prior to {@link android.os.Build.VERSION_CODES#MNC},
* calling this method between an adapter data set change and a subsequent
* layout pass could return invalid data.
*
* @return the selected item's row ID, or {@link #INVALID_ROW_ID} if
* nothing is selected
*/
@ViewDebug.CapturedViewProperty
public long getSelectedItemId() {
syncSelectedItem();
return mNextSelectedRowId;
}
/**
* @return The view corresponding to the currently selected item, or null
* if nothing is selected
* Returns the view corresponding to the currently selected item, or
* {@code null} if nothing is selected.
* <p>
* <strong>Note:</strong> Prior to {@link android.os.Build.VERSION_CODES#MNC},
* calling this method between an adapter data set change and a subsequent
* layout pass could return inconsistent data.
*
* @return the selected item's view, or {@code null} if nothing is selected
*/
@Nullable
public abstract View getSelectedView();
/**
* @return The data corresponding to the currently selected item, or
* null if there is nothing selected.
* Returns the data corresponding to the currently selected item, or
* {@code null} if nothing is selected.
* <p>
* <strong>Note:</strong> Prior to {@link android.os.Build.VERSION_CODES#MNC},
* calling this method between an adapter data set change and a subsequent
* layout pass could return inconsistent data.
*
* @return the data corresponding to the currently selected item, or
* {@code null} if there is nothing selected.
*/
@Nullable
public Object getSelectedItem() {
T adapter = getAdapter();
int selection = getSelectedItemPosition();
final T adapter = getAdapter();
final int selection = getSelectedItemPosition();
if (adapter != null && adapter.getCount() > 0 && selection >= 0) {
return adapter.getItem(selection);
} else {
@@ -589,6 +619,15 @@ public abstract class AdapterView<T extends Adapter> extends ViewGroup {
}
}
/**
* Synchronizes the selected item's position and ID, if necessary.
*/
void syncSelectedItem() {
if (mDataChanged) {
onLayout(false, mLeft, mTop, mRight, mBottom);
}
}
/**
* @return The number of items owned by the Adapter associated with this
* AdapterView. (This is the number of data items, which may be