summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJin Cao <jinyan@google.com>2014-08-01 12:23:34 -0700
committerJin Cao <jinyan@google.com>2014-08-01 12:23:34 -0700
commiteb145d45c17b08ce09131e84b96350925b3db81a (patch)
tree53d72ffd57ad01d5472d9124ff6eaf16db1cd118 /src
parentacb016a581b2ac0c7bfeb421a2a1501ba9e2fbdf (diff)
downloadandroid_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.java27
-rw-r--r--src/com/android/mail/ui/ConversationListFragment.java18
-rw-r--r--src/com/android/mail/ui/SwipeableListView.java3
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();
}