diff options
-rw-r--r-- | core/java/android/widget/AbsListView.java | 7 | ||||
-rw-r--r-- | core/java/android/widget/AdapterView.java | 59 |
2 files changed, 56 insertions, 10 deletions
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index a3332fa..c9ed369 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -5306,6 +5306,13 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te } @Override + void syncSelectedItem() { + if (mDataChanged) { + layoutChildren(); + } + } + + @Override protected void handleDataChanged() { int count = mItemCount; int lastHandledItemCount = mLastHandledItemCount; diff --git a/core/java/android/widget/AdapterView.java b/core/java/android/widget/AdapterView.java index 6962711..cfe02bd 100644 --- a/core/java/android/widget/AdapterView.java +++ b/core/java/android/widget/AdapterView.java @@ -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 { @@ -590,6 +620,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 * larger than the number of visible views.) |