Bug 1319254 - Pre: implement stable IDs for AS RecyclerView r?sebastian
MozReview-Commit-ID: KfAswxOU8Nw
--- a/mobile/android/base/java/org/mozilla/gecko/home/activitystream/StreamRecyclerAdapter.java
+++ b/mobile/android/base/java/org/mozilla/gecko/home/activitystream/StreamRecyclerAdapter.java
@@ -27,16 +27,20 @@ public class StreamRecyclerAdapter exten
private HomePager.OnUrlOpenListener onUrlOpenListener;
private HomePager.OnUrlOpenInBackgroundListener onUrlOpenInBackgroundListener;
private int tiles;
private int tilesWidth;
private int tilesHeight;
+ public StreamRecyclerAdapter() {
+ setHasStableIds(true);
+ }
+
void setOnUrlOpenListeners(HomePager.OnUrlOpenListener onUrlOpenListener, HomePager.OnUrlOpenInBackgroundListener onUrlOpenInBackgroundListener) {
this.onUrlOpenListener = onUrlOpenListener;
this.onUrlOpenInBackgroundListener = onUrlOpenInBackgroundListener;
}
public void setTileSize(int tiles, int tilesWidth, int tilesHeight) {
this.tilesWidth = tilesWidth;
this.tilesHeight = tilesHeight;
@@ -133,9 +137,50 @@ public class StreamRecyclerAdapter exten
notifyDataSetChanged();
}
public void swapTopSitesCursor(Cursor cursor) {
this.topSitesCursor = cursor;
notifyItemChanged(0);
}
+
+ @Override
+ public long getItemId(int position) {
+ final int type = getItemViewType(position);
+
+ // To avoid having clashing IDs, we:
+ // - use history ID's as is
+ // - use hardcoded negative ID's for fixed panels
+ // - multiply bookmark ID's by -1 to not clash with history, and add an offset to not
+ // clash with the fixed panels above
+ final int offset = -10;
+
+ // RecyclerView.NO_ID is -1, so start our hard-coded IDs at -2.
+ switch (type) {
+ case TopPanel.LAYOUT_ID:
+ return -2;
+ case HighlightsTitle.LAYOUT_ID:
+ return -3;
+ case HighlightItem.LAYOUT_ID:
+ final int cursorPosition = translatePositionToCursor(position);
+ highlightsCursor.moveToPosition(cursorPosition);
+
+ final long historyID = highlightsCursor.getLong(highlightsCursor.getColumnIndexOrThrow(BrowserContract.Combined.HISTORY_ID));
+ final boolean isHistory = -1 != historyID;
+
+ if (isHistory) {
+ return historyID;
+ }
+
+ final long bookmarkID = highlightsCursor.getLong(highlightsCursor.getColumnIndexOrThrow(BrowserContract.Combined.BOOKMARK_ID));
+ final boolean isBookmark = -1 != bookmarkID;
+
+ if (isBookmark) {
+ return -1 * bookmarkID + offset;
+ }
+
+ throw new IllegalArgumentException("Unhandled highlight type in getItemId - has no history or bookmark ID");
+ default:
+ throw new IllegalArgumentException("StreamItem with LAYOUT_ID=" + type + " not handled in getItemId()");
+ }
+ }
}