From f9b96e244e6c6a19cb1920ff129f424997db2727 Mon Sep 17 00:00:00 2001 From: Jin Cao Date: Fri, 17 Oct 2014 13:42:10 -0700 Subject: Save the focused conversation via id instead of position Don't rely on saving the position in the adapter because the position might change as the adapter's data set changes (e.g. new mails via sync), and we have no way of modifying the focused position accordingly. Instead, save the focused conversation with its id (tried using the uri, but the uri might change when the conversation gets cached). This way, no matter what happens to the items in the adapter, the focused item remains consistent. b/18027602 Change-Id: I51aa68bc15c5892c3b34bde5c199de281390ce7b --- .../android/mail/ui/ConversationListFragment.java | 30 +++++++++++----------- 1 file changed, 15 insertions(+), 15 deletions(-) (limited to 'src/com/android/mail/ui/ConversationListFragment.java') diff --git a/src/com/android/mail/ui/ConversationListFragment.java b/src/com/android/mail/ui/ConversationListFragment.java index d80cdf9ad..439f6b597 100644 --- a/src/com/android/mail/ui/ConversationListFragment.java +++ b/src/com/android/mail/ui/ConversationListFragment.java @@ -493,7 +493,7 @@ public final class ConversationListFragment extends Fragment implements sb.append(mViewContext.folder); if (mListView != null) { sb.append(" selectedPos="); - sb.append(mListView.getSelectedPosition()); + sb.append(mListView.getSelectedConversationPosDebug()); sb.append(" listSelectedPos="); sb.append(mListView.getSelectedItemPosition()); sb.append(" isListInTouchMode="); @@ -858,7 +858,7 @@ public final class ConversationListFragment extends Fragment implements * special views in the list. */ conv.position = cursor.getPosition(); - setActivated(conv.position, true); + setActivated(conv, true); mCallbacks.onConversationSelected(conv, false /* inLoaderCallbacks */); } else { LogUtils.e(LOG_TAG, @@ -869,41 +869,41 @@ public final class ConversationListFragment extends Fragment implements /** * Sets the checked conversation to the position given here. - * @param cursorPosition The position of the conversation in the cursor (as opposed to - * in the list) + * @param conversation the activated conversation. * @param different if the currently checked conversation is different from the one provided * here. This is a difference in conversations, not a difference in positions. For example, a * conversation at position 2 can move to position 4 as a result of new mail. */ - public void setActivated(final int cursorPosition, boolean different) { - if (mListView.getChoiceMode() == ListView.CHOICE_MODE_NONE) { + public void setActivated(final Conversation conversation, boolean different) { + if (mListView.getChoiceMode() == ListView.CHOICE_MODE_NONE || conversation == null) { return; } + final int cursorPosition = conversation.position; final int position = cursorPosition + mListAdapter.getPositionOffset(cursorPosition); setRawActivated(position, different); - setRawSelected(position); + setRawSelected(conversation, position); } /** * Set the selected conversation (used by the framework to indicate current focus in the list). - * @param cursorPosition The position of the conversation in the cursor (as opposed to - * in the list) + * @param conversation the selected conversation. */ - public void setSelected(final int cursorPosition) { - if (mListView.getChoiceMode() == ListView.CHOICE_MODE_NONE) { + public void setSelected(final Conversation conversation) { + if (mListView.getChoiceMode() == ListView.CHOICE_MODE_NONE || conversation == null) { return; } + final int cursorPosition = conversation.position; final int position = cursorPosition + mListAdapter.getPositionOffset(cursorPosition); - setRawSelected(position); + setRawSelected(conversation, position); } /** * Set the selected conversation (used by the framework to indicate current focus in the list). * @param position The position of the item in the list */ - private void setRawSelected(final int position) { + private void setRawSelected(Conversation conversation, final int position) { final View selectedView = mListView.getChildAt( position - mListView.getFirstVisiblePosition()); // Don't do anything if the view is already selected. @@ -919,7 +919,7 @@ public final class ConversationListFragment extends Fragment implements // setSelection calls setSelectionFromTop with y = 0. mListView.setSelectionFromTop(position, selectedView.getTop()); } - mListView.setSelectedPosition(position); + mListView.setSelectedConversation(conversation); } } @@ -1154,7 +1154,7 @@ public final class ConversationListFragment extends Fragment implements if (conv != null && !currentConvIsPeeking) { if (mListView.getChoiceMode() != ListView.CHOICE_MODE_NONE && mListView.getCheckedItemPosition() == -1) { - setActivated(conv.position, true); + setActivated(conv, true); } } } -- cgit v1.2.3