From 633285a7872df21ad0fba1c29ee557fbdd6489cc Mon Sep 17 00:00:00 2001 From: anthony restaino Date: Fri, 12 May 2017 21:33:15 -0400 Subject: [PATCH] Using diffutil to simplify updating the list --- .../lightning/fragment/BookmarksFragment.java | 86 +++++++++++++------ 1 file changed, 62 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/acr/browser/lightning/fragment/BookmarksFragment.java b/app/src/main/java/acr/browser/lightning/fragment/BookmarksFragment.java index 8c4964f..c268f49 100644 --- a/app/src/main/java/acr/browser/lightning/fragment/BookmarksFragment.java +++ b/app/src/main/java/acr/browser/lightning/fragment/BookmarksFragment.java @@ -11,6 +11,7 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.view.ViewCompat; +import android.support.v7.util.DiffUtil; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; @@ -88,9 +89,6 @@ public class BookmarksFragment extends Fragment implements View.OnClickListener, // Preloaded images private Bitmap mWebpageBitmap, mFolderBitmap; - // Bookmarks - private final List mBookmarks = new ArrayList<>(); - // Views @BindView(R.id.right_drawer_list) RecyclerView mBookmarksListView; @BindView(R.id.starIcon) ImageView mBookmarkTitleImage; @@ -136,8 +134,7 @@ public class BookmarksFragment extends Fragment implements View.OnClickListener, // Handle bookmark click private final OnItemClickListener mItemClickListener = new OnItemClickListener() { @Override - public void onItemClick(int position) { - final HistoryItem item = mBookmarks.get(position); + public void onItemClick(@NonNull HistoryItem item) { if (item.isFolder()) { mScrollIndex = ((LinearLayoutManager) mBookmarksListView.getLayoutManager()).findFirstVisibleItemPosition(); setBookmarksShown(item.getTitle(), true); @@ -149,8 +146,7 @@ public class BookmarksFragment extends Fragment implements View.OnClickListener, private final OnItemLongClickListener mItemLongClickListener = new OnItemLongClickListener() { @Override - public boolean onItemLongClick(int position) { - final HistoryItem item = mBookmarks.get(position); + public boolean onItemLongClick(@NonNull HistoryItem item) { handleLongPress(item); return true; } @@ -184,7 +180,7 @@ public class BookmarksFragment extends Fragment implements View.OnClickListener, setupNavigationButton(view, R.id.action_reading, R.id.icon_reading); setupNavigationButton(view, R.id.action_toggle_desktop, R.id.icon_desktop); - mBookmarkAdapter = new BookmarkListAdapter(mBookmarks, mFaviconModel, mFolderBitmap, mWebpageBitmap); + mBookmarkAdapter = new BookmarkListAdapter(mFaviconModel, mFolderBitmap, mWebpageBitmap); mBookmarkAdapter.setOnItemClickListener(mItemClickListener); mBookmarkAdapter.setOnItemLongClickListener(mItemLongClickListener); mBookmarksListView.setLayoutManager(new LinearLayoutManager(getContext())); @@ -250,11 +246,10 @@ public class BookmarksFragment extends Fragment implements View.OnClickListener, @Override public void handleBookmarkDeleted(@NonNull HistoryItem item) { - mBookmarks.remove(item); if (item.isFolder()) { setBookmarksShown(null, false); } else { - mBookmarkAdapter.notifyDataSetChanged(); + mBookmarkAdapter.deleteItem(item); } } @@ -289,9 +284,7 @@ public class BookmarksFragment extends Fragment implements View.OnClickListener, } private void setBookmarkDataSet(@NonNull List items, boolean animate) { - mBookmarks.clear(); - mBookmarks.addAll(items); - mBookmarkAdapter.notifyDataSetChanged(); + mBookmarkAdapter.updateItems(items); final int resource; if (mUiModel.isRootFolder()) { resource = R.drawable.ic_action_star; @@ -376,15 +369,20 @@ public class BookmarksFragment extends Fragment implements View.OnClickListener, @BindView(R.id.textBookmark) TextView txtTitle; @BindView(R.id.faviconBookmark) ImageView favicon; + @NonNull private final BookmarkListAdapter adapter; + @Nullable private final OnItemLongClickListener onItemLongClickListener; @Nullable private final OnItemClickListener onItemClickListener; BookmarkViewHolder(@NonNull View itemView, + @NonNull BookmarkListAdapter adapter, @Nullable OnItemLongClickListener onItemLongClickListener, @Nullable OnItemClickListener onItemClickListener) { super(itemView); ButterKnife.bind(this, itemView); + this.adapter = adapter; + this.onItemClickListener = onItemClickListener; this.onItemLongClickListener = onItemLongClickListener; @@ -394,29 +392,31 @@ public class BookmarksFragment extends Fragment implements View.OnClickListener, @Override public void onClick(View v) { - if (onItemClickListener != null) { - onItemClickListener.onItemClick(getAdapterPosition()); + int index = getAdapterPosition(); + if (onItemClickListener != null && index != RecyclerView.NO_ID) { + onItemClickListener.onItemClick(adapter.itemAt(index)); } } @Override public boolean onLongClick(View v) { - return onItemLongClickListener != null && - onItemLongClickListener.onItemLongClick(getAdapterPosition()); + int index = getAdapterPosition(); + return index != RecyclerView.NO_POSITION && onItemLongClickListener != null && + onItemLongClickListener.onItemLongClick(adapter.itemAt(index)); } } interface OnItemLongClickListener { - boolean onItemLongClick(int position); + boolean onItemLongClick(@NonNull HistoryItem item); } interface OnItemClickListener { - void onItemClick(int position); + void onItemClick(@NonNull HistoryItem item); } private static class BookmarkListAdapter extends RecyclerView.Adapter { - @NonNull private final List mBookmarks; + @NonNull private List mBookmarks = new ArrayList<>(); @NonNull private final FaviconModel mFaviconModel; @NonNull private final Bitmap mFolderBitmap; @NonNull private final Bitmap mWebpageBitmap; @@ -424,11 +424,9 @@ public class BookmarksFragment extends Fragment implements View.OnClickListener, @Nullable private OnItemLongClickListener mOnItemLongCLickListener; @Nullable private OnItemClickListener mOnItemClickListener; - BookmarkListAdapter(@NonNull List bookmarks, - @NonNull FaviconModel faviconModel, + BookmarkListAdapter(@NonNull FaviconModel faviconModel, @NonNull Bitmap folderBitmap, @NonNull Bitmap webpageBitmap) { - mBookmarks = bookmarks; mFaviconModel = faviconModel; mFolderBitmap = folderBitmap; mWebpageBitmap = webpageBitmap; @@ -442,12 +440,52 @@ public class BookmarksFragment extends Fragment implements View.OnClickListener, mOnItemClickListener = listener; } + @NonNull + HistoryItem itemAt(int position) { + return mBookmarks.get(position); + } + + void deleteItem(@NonNull HistoryItem item) { + List newList = new ArrayList<>(mBookmarks); + newList.remove(item); + updateItems(newList); + } + + void updateItems(@NonNull List newList) { + final List oldList = mBookmarks; + mBookmarks = newList; + + DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new DiffUtil.Callback() { + @Override + public int getOldListSize() { + return oldList.size(); + } + + @Override + public int getNewListSize() { + return mBookmarks.size(); + } + + @Override + public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) { + return oldList.get(oldItemPosition).equals(mBookmarks.get(newItemPosition)); + } + + @Override + public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) { + return oldList.get(oldItemPosition).equals(mBookmarks.get(newItemPosition)); + } + }); + + diffResult.dispatchUpdatesTo(this); + } + @Override public BookmarkViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { LayoutInflater inflater = LayoutInflater.from(parent.getContext()); View itemView = inflater.inflate(R.layout.bookmark_list_item, parent, false); - return new BookmarkViewHolder(itemView, mOnItemLongCLickListener, mOnItemClickListener); + return new BookmarkViewHolder(itemView, this, mOnItemLongCLickListener, mOnItemClickListener); } @Override