Chromium Code Reviews| Index: chrome/android/java/src/org/chromium/chrome/browser/widget/DateDividedAdapter.java |
| diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/DateDividedAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/DateDividedAdapter.java |
| index 003498dfac2ddc17d37384982a0356d1681fc094..1a2f7b128934d3b1663328a55361201713fb6e3d 100644 |
| --- a/chrome/android/java/src/org/chromium/chrome/browser/widget/DateDividedAdapter.java |
| +++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/DateDividedAdapter.java |
| @@ -105,6 +105,12 @@ public abstract class DateDividedAdapter extends Adapter<RecyclerView.ViewHolder |
| } |
| } |
| + protected static class HeaderViewHolder extends RecyclerView.ViewHolder { |
| + public HeaderViewHolder(View itemView) { |
| + super(itemView); |
| + } |
| + } |
| + |
| /** |
| * A bucket of items with the same date. |
| */ |
| @@ -116,6 +122,7 @@ public abstract class DateDividedAdapter extends Adapter<RecyclerView.ViewHolder |
| private int mIndex; |
| private boolean mIsSorted; |
| + private boolean mIsHeader; |
|
gone
2016/12/12 19:14:13
"Header" is a little too generic because the dates
Theresa
2016/12/12 20:09:04
Done.
|
| public ItemGroup(TimedItem item) { |
| mDate = new Date(item.getTimestamp()); |
| @@ -161,11 +168,16 @@ public abstract class DateDividedAdapter extends Adapter<RecyclerView.ViewHolder |
| * @return The size of this group. |
| */ |
| public int size() { |
| + if (mIsHeader) return 1; |
| + |
| // Plus 1 to account for the date header. |
| return mItems.size() + 1; |
| } |
| public TimedItem getItemAt(int index) { |
| + // If this is the header, there is only one item. |
|
gone
2016/12/12 19:14:13
What happens if you don't add this clause? I wond
Theresa
2016/12/12 20:09:04
Done.
|
| + if (mIsHeader) return mItems.get(0); |
| + |
| // 0 is allocated to the date header. |
| if (index == 0) return null; |
| @@ -205,8 +217,10 @@ public abstract class DateDividedAdapter extends Adapter<RecyclerView.ViewHolder |
| public static final int TYPE_DATE = 0; |
| public static final int TYPE_NORMAL = 1; |
| + public static final int TYPE_HEADER = 2; |
|
gone
2016/12/12 19:14:13
TYPE_HEADER should be 0 since it's at the top. I
Theresa
2016/12/12 20:09:04
Done.
|
| private int mSize; |
| + private boolean mHasHeader; |
| private SortedSet<ItemGroup> mGroups = new TreeSet<>(new Comparator<ItemGroup>() { |
| @Override |
| public int compare(ItemGroup lhs, ItemGroup rhs) { |
| @@ -221,6 +235,14 @@ public abstract class DateDividedAdapter extends Adapter<RecyclerView.ViewHolder |
| protected abstract ViewHolder createViewHolder(ViewGroup parent); |
| /** |
| + * Creates a {@link HeaderViewHolder} in the given parent. |
| + * @see #onCreateViewHolder(ViewGroup, int) |
| + */ |
| + protected HeaderViewHolder createHeader(ViewGroup parent) { |
| + return null; |
| + } |
| + |
| + /** |
| * Binds the {@link ViewHolder} with the given {@link TimedItem}. |
| * @see #onBindViewHolder(ViewHolder, int) |
| */ |
| @@ -236,12 +258,6 @@ public abstract class DateDividedAdapter extends Adapter<RecyclerView.ViewHolder |
| * Loads a list of {@link TimedItem}s to this adapter. Any previous data will be removed. |
| */ |
| public void loadItems(List<? extends TimedItem> timedItems) { |
| - mSize = 0; |
| - |
| - // Unset the positions of all items in the list. |
| - for (ItemGroup group : mGroups) group.resetPosition(); |
| - mGroups.clear(); |
| - |
| for (TimedItem timedItem : timedItems) { |
| Date date = new Date(timedItem.getTimestamp()); |
| boolean found = false; |
| @@ -272,12 +288,40 @@ public abstract class DateDividedAdapter extends Adapter<RecyclerView.ViewHolder |
| } |
| /** |
| + * Adds a header as the first group in this adapter. |
| + */ |
| + public void addHeader() { |
| + ItemGroup header = new ItemGroup(new TimedItem() { |
| + @Override |
| + public long getTimestamp() { |
| + return Long.MAX_VALUE; |
| + } |
| + |
| + @Override |
| + public long getStableId() { |
| + return Long.MAX_VALUE; |
| + } |
| + }); |
| + header.mIsHeader = true; |
| + |
| + mGroups.add(header); |
|
gone
2016/12/12 19:14:13
Should assert the size is 0 at this point. The ad
Theresa
2016/12/12 20:09:04
Done.
|
| + mSize++; |
| + mHasHeader = true; |
| + } |
| + |
| + /** |
| * Removes all items from this adapter. |
| + * @param notifyDataSetChanged Whether to notify that the data set has been changed. |
| */ |
| - public void clear() { |
| + public void clear(boolean notifyDataSetChanged) { |
| mSize = 0; |
| + mHasHeader = false; |
| + |
| + // Unset the positions of all items in the list. |
| + for (ItemGroup group : mGroups) group.resetPosition(); |
| mGroups.clear(); |
| - notifyDataSetChanged(); |
| + |
| + if (notifyDataSetChanged) notifyDataSetChanged(); |
| } |
| @Override |
| @@ -301,7 +345,7 @@ public abstract class DateDividedAdapter extends Adapter<RecyclerView.ViewHolder |
| @Override |
| public final int getItemViewType(int position) { |
| Pair<ItemGroup, Integer> pair = getGroupAt(position); |
| - return pair.second == 0 ? TYPE_DATE : TYPE_NORMAL; |
| + return pair.second == -1 ? TYPE_HEADER : pair.second == 0 ? TYPE_DATE : TYPE_NORMAL; |
|
gone
2016/12/12 19:14:13
1) Should just expand this into a set of condition
Theresa
2016/12/12 20:09:04
Done. I made TYPE_HEADER = -1.
|
| } |
| @Override |
| @@ -311,6 +355,8 @@ public abstract class DateDividedAdapter extends Adapter<RecyclerView.ViewHolder |
| getTimedItemViewResId(), parent, false)); |
| } else if (viewType == TYPE_NORMAL) { |
| return createViewHolder(parent); |
| + } else if (viewType == TYPE_HEADER) { |
| + return createHeader(parent); |
| } |
|
gone
2016/12/12 19:14:13
Should assert false at this point; I don't know ho
Theresa
2016/12/12 20:09:04
Done.
|
| return null; |
| } |
| @@ -320,7 +366,7 @@ public abstract class DateDividedAdapter extends Adapter<RecyclerView.ViewHolder |
| Pair<Date, TimedItem> pair = getItemAt(position); |
| if (holder instanceof DateViewHolder) { |
| ((DateViewHolder) holder).setDate(pair.first); |
| - } else { |
| + } else if (!(holder instanceof HeaderViewHolder)) { |
|
gone
2016/12/12 19:14:13
null !instanceof HeaderViewHolder, so this would l
Theresa
2016/12/12 20:09:04
I don't think that null can be passed in for the h
|
| bindViewHolderForTimedItem(holder, pair.second); |
| } |
| } |
| @@ -336,6 +382,10 @@ public abstract class DateDividedAdapter extends Adapter<RecyclerView.ViewHolder |
| protected Pair<ItemGroup, Integer> getGroupAt(int position) { |
| // TODO(ianwen): Optimize the performance if the number of groups becomes too large. |
| int i = position; |
|
gone
2016/12/12 19:14:13
Move the int i line down to the for loop area.
Theresa
2016/12/12 20:09:04
Done.
|
| + if (mHasHeader && position == 0) { |
| + return new Pair<>(mGroups.first(), -1); |
| + } |
| + |
| for (ItemGroup group : mGroups) { |
| if (i >= group.size()) { |
| i -= group.size(); |