summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/java/android/widget/AbsListView.java7
-rw-r--r--core/java/android/widget/AdapterView.java59
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.)