private QuranRow[] getTags() { BookmarksDBAdapter adapter = null; Activity activity = getActivity(); if (activity != null && activity instanceof BookmarkHandler) { adapter = ((BookmarkHandler) activity).getBookmarksAdapter(); } if (adapter == null) { return null; } List<Tag> tags; switch (mCurrentSortCriteria) { case R.id.sort_date: tags = adapter.getTags(BookmarksDBAdapter.SORT_DATE_ADDED); break; case R.id.sort_alphabetical: default: tags = adapter.getTags(BookmarksDBAdapter.SORT_ALPHABETICAL); break; } List<Bookmark> bookmarks = adapter.getBookmarks(true); List<QuranRow> rows = new ArrayList<QuranRow>(); List<Bookmark> unTagged = new ArrayList<Bookmark>(); Map<Long, List<Bookmark>> tagMap = new HashMap<Long, List<Bookmark>>(); for (Bookmark bookmark : bookmarks) { List<Tag> bookmarkTags = bookmark.mTags; if (bookmarkTags == null) { unTagged.add(bookmark); } else { for (Tag tag : bookmarkTags) { List<Bookmark> tagBookmarkList = tagMap.get(tag.mId); if (tagBookmarkList == null) { List<Bookmark> newList = new ArrayList<Bookmark>(); newList.add(bookmark); tagMap.put(tag.mId, newList); } else { tagBookmarkList.add(bookmark); } } } } for (Tag tag : tags) { List<Bookmark> tagBookmarkList = tagMap.get(tag.mId); // add the tag header QuranRow bookmarkHeader = new QuranRow(tag.mName, null, QuranRow.BOOKMARK_HEADER, 0, 0, null); bookmarkHeader.tagId = tag.mId; rows.add(bookmarkHeader); // no bookmarks in this tag, so move on if (tagBookmarkList == null || tagBookmarkList.isEmpty()) { continue; } // and now the bookmarks for (Bookmark bookmark : tagBookmarkList) { QuranRow row = createRow(activity, tag.mId, bookmark); rows.add(row); } } if (unTagged.size() > 0) { QuranRow header = new QuranRow( activity.getString(R.string.not_tagged), "", QuranRow.BOOKMARK_HEADER, 0, 0, null); header.tagId = -1; rows.add(header); for (Bookmark bookmark : unTagged) { QuranRow row = createRow(activity, -1, bookmark); rows.add(row); } } return rows.toArray(new QuranRow[rows.size()]); }