diff options
author | Jin Cao <jinyan@google.com> | 2014-08-01 12:23:34 -0700 |
---|---|---|
committer | Jin Cao <jinyan@google.com> | 2014-08-01 12:23:34 -0700 |
commit | eb145d45c17b08ce09131e84b96350925b3db81a (patch) | |
tree | 53d72ffd57ad01d5472d9124ff6eaf16db1cd118 /src | |
parent | acb016a581b2ac0c7bfeb421a2a1501ba9e2fbdf (diff) | |
download | android_packages_apps_UnifiedEmail-eb145d45c17b08ce09131e84b96350925b3db81a.tar.gz android_packages_apps_UnifiedEmail-eb145d45c17b08ce09131e84b96350925b3db81a.tar.bz2 android_packages_apps_UnifiedEmail-eb145d45c17b08ce09131e84b96350925b3db81a.zip |
Ditch HeaderViewListAdapter and support headers
Support arbitrary number of headers in AnimatedAdapter
instead of relying on ListView#addHeaderView and
HeaderViewListAdapter.
b/16728934
Change-Id: I1e4d02ac8b6557411ab47895002088d798ff2fc2
Diffstat (limited to 'src')
-rw-r--r-- | src/com/android/mail/ui/AnimatedAdapter.java | 27 | ||||
-rw-r--r-- | src/com/android/mail/ui/ConversationListFragment.java | 18 | ||||
-rw-r--r-- | src/com/android/mail/ui/SwipeableListView.java | 3 |
3 files changed, 29 insertions, 19 deletions
diff --git a/src/com/android/mail/ui/AnimatedAdapter.java b/src/com/android/mail/ui/AnimatedAdapter.java index 5215cdc6f..5eeee2a4d 100644 --- a/src/com/android/mail/ui/AnimatedAdapter.java +++ b/src/com/android/mail/ui/AnimatedAdapter.java @@ -53,6 +53,7 @@ import com.android.mail.ui.SwipeableListView.ListItemsRemovedListener; import com.android.mail.utils.LogTag; import com.android.mail.utils.LogUtils; import com.android.mail.utils.Utils; +import com.google.common.collect.Lists; import com.google.common.collect.Maps; import java.util.ArrayList; @@ -71,6 +72,7 @@ public class AnimatedAdapter extends SimpleCursorAdapter { private static final String LEAVE_BEHIND_ITEM_ID = "leave_behind_item_id"; private final static int TYPE_VIEW_CONVERSATION = 0; private final static int TYPE_VIEW_FOOTER = 1; + private final static int TYPE_VIEW_HEADER = 2; private final static int TYPE_VIEW_DONT_RECYCLE = -1; private final HashSet<Long> mDeletingItems = new HashSet<Long>(); private final ArrayList<Long> mLastDeletingItems = new ArrayList<Long>(); @@ -162,6 +164,7 @@ public class AnimatedAdapter extends SimpleCursorAdapter { private View mFooter; private boolean mShowFooter; + private List<View> mHeaders = Lists.newArrayList(); private Folder mFolder; private final SwipeableListView mListView; private boolean mSwipeEnabled; @@ -304,8 +307,8 @@ public class AnimatedAdapter extends SimpleCursorAdapter { // mSpecialViews only contains the views that are currently being displayed final int specialViewCount = mSpecialViews.size(); - final int count = super.getCount() + specialViewCount; - return mShowFooter ? count + 1 : count; + return super.getCount() + specialViewCount + + (mShowFooter ? 1 : 0) + mHeaders.size(); } /** @@ -385,7 +388,9 @@ public class AnimatedAdapter extends SimpleCursorAdapter { @Override public int getItemViewType(int position) { // Try to recycle views. - if (mShowFooter && position == getCount() - 1) { + if (mHeaders.size() > position) { + return TYPE_VIEW_HEADER; + } else if (mShowFooter && position == getCount() - 1) { return TYPE_VIEW_FOOTER; } else if (hasLeaveBehinds() || isAnimating()) { // Setting as type -1 means the recycler won't take this view and @@ -465,7 +470,9 @@ public class AnimatedAdapter extends SimpleCursorAdapter { @Override public View getView(int position, View convertView, ViewGroup parent) { - if (mShowFooter && position == getCount() - 1) { + if (mHeaders.size() > position) { + return mHeaders.get(position); + } else if (mShowFooter && position == getCount() - 1) { return mFooter; } @@ -691,7 +698,7 @@ public class AnimatedAdapter extends SimpleCursorAdapter { @Override public long getItemId(int position) { - if (mShowFooter && position == getCount() - 1) { + if ((mHeaders.size() > position) || (mShowFooter && position == getCount() - 1)) { return -1; } @@ -777,7 +784,9 @@ public class AnimatedAdapter extends SimpleCursorAdapter { @Override public Object getItem(int position) { - if (mShowFooter && position == getCount() - 1) { + if (mHeaders.size() > position) { + return mHeaders.get(position); + } else if (mShowFooter && position == getCount() - 1) { return mFooter; } else if (mSpecialViews.get(position) != null) { return mSpecialViews.get(position); @@ -868,6 +877,10 @@ public class AnimatedAdapter extends SimpleCursorAdapter { mFooter = footerView; } + public void addHeader(View headerView) { + mHeaders.add(headerView); + } + public void setFolder(Folder folder) { mFolder = folder; } @@ -1094,7 +1107,7 @@ public class AnimatedAdapter extends SimpleCursorAdapter { * that may be above it. */ public int getPositionOffset(final int position) { - int viewsAbove = 0; + int viewsAbove = mHeaders.size(); for (int i = 0, size = mSpecialViews.size(); i < size; i++) { final int bidPosition = mSpecialViews.keyAt(i); diff --git a/src/com/android/mail/ui/ConversationListFragment.java b/src/com/android/mail/ui/ConversationListFragment.java index 33497ee44..a956c65fb 100644 --- a/src/com/android/mail/ui/ConversationListFragment.java +++ b/src/com/android/mail/ui/ConversationListFragment.java @@ -317,6 +317,15 @@ public final class ConversationListFragment extends ListFragment implements mListAdapter = new AnimatedAdapter(mActivity.getApplicationContext(), conversationCursor, mActivity.getSelectedSet(), mActivity, mListView, specialItemViews); mListAdapter.addFooter(mFooterView); + // Show search result header only if we are in search mode + final boolean showSearchHeader = ConversationListContext.isSearchResult(mViewContext); + if (showSearchHeader) { + mSearchHeaderView = inflater.inflate(R.layout.search_results_view, null); + mSearchResultCountTextView = (TextView) + mSearchHeaderView.findViewById(R.id.search_result_count_view); + mListAdapter.addHeader(mSearchHeaderView); + } + mListView.setAdapter(mListAdapter); mSelectedSet = mActivity.getSelectedSet(); mListView.setSelectionSet(mSelectedSet); @@ -443,15 +452,6 @@ public final class ConversationListFragment extends ListFragment implements mListView.setListItemSwipedListener(this); mListView.setSwipeListener(this); - // Show search result header only if we are in search mode - final boolean showSearchHeader = ConversationListContext.isSearchResult(mViewContext); - if (showSearchHeader) { - mSearchHeaderView = inflater.inflate(R.layout.search_results_view, null); - mSearchResultCountTextView = (TextView) - mSearchHeaderView.findViewById(R.id.search_result_count_view); - mListView.addHeaderView(mSearchHeaderView); - } - // enable animateOnLayout (equivalent of setLayoutTransition) only for >=JB (b/14302062) if (Utils.isRunningJellybeanOrLater()) { ((ViewGroup) rootView.findViewById(R.id.conversation_list_parent_frame)) diff --git a/src/com/android/mail/ui/SwipeableListView.java b/src/com/android/mail/ui/SwipeableListView.java index fd2184f4f..6d603ab44 100644 --- a/src/com/android/mail/ui/SwipeableListView.java +++ b/src/com/android/mail/ui/SwipeableListView.java @@ -330,9 +330,6 @@ public class SwipeableListView extends ListView implements Callback, OnScrollLis } private AnimatedAdapter getAnimatedAdapter() { - if (getAdapter() instanceof HeaderViewListAdapter) { - return (AnimatedAdapter) ((HeaderViewListAdapter) getAdapter()).getWrappedAdapter(); - } return (AnimatedAdapter) getAdapter(); } |