Fix race condition.
Crash was reported where the checked item position had yet to be
set when the list tried to get it. This uses a listener to make sure
that the checked item isnt set in the list until the adapter has it.
Change-Id: I2b5170ab9440bbb0a69989657313b1a4b6d653cd
diff --git a/src/com/android/ex/chips/RecipientAlternatesAdapter.java b/src/com/android/ex/chips/RecipientAlternatesAdapter.java
index 3d2c87b..792fdcc 100644
--- a/src/com/android/ex/chips/RecipientAlternatesAdapter.java
+++ b/src/com/android/ex/chips/RecipientAlternatesAdapter.java
@@ -37,7 +37,10 @@
private int mCheckedItemPosition = -1;
- public RecipientAlternatesAdapter(Context context, long contactId, long currentId, int viewId) {
+ private OnCheckedItemChangedListener mCheckedItemChangedListener;
+
+ public RecipientAlternatesAdapter(Context context, long contactId, long currentId, int viewId,
+ OnCheckedItemChangedListener listener) {
super(context, context.getContentResolver().query(Email.CONTENT_URI, EmailQuery.PROJECTION,
Email.CONTACT_ID + " =?", new String[] {
String.valueOf(contactId)
@@ -45,6 +48,7 @@
mLayoutInflater = LayoutInflater.from(context);
mLayoutId = viewId;
mCurrentId = currentId;
+ mCheckedItemChangedListener = listener;
}
@Override
@@ -71,6 +75,9 @@
}
if (cursor.getLong(EmailQuery.DATA_ID) == mCurrentId) {
mCheckedItemPosition = position;
+ if (mCheckedItemChangedListener != null) {
+ mCheckedItemChangedListener.onCheckedItemChanged(mCheckedItemPosition);
+ }
}
bindView(convertView, convertView.getContext(), cursor);
return convertView;
@@ -109,10 +116,7 @@
return mLayoutInflater.inflate(mLayoutId, null);
}
- /**
- * Get the position of the item that should be checked.
- */
- public int getCheckedItemPosition() {
- return mCheckedItemPosition;
+ /*package*/ static interface OnCheckedItemChangedListener {
+ public void onCheckedItemChanged(int position);
}
}