From 54d6fca7341aaf57a8ada8c7c0520a7a141e18d6 Mon Sep 17 00:00:00 2001 From: Shinokuni Date: Wed, 6 Mar 2019 11:58:16 +0100 Subject: [PATCH] Add DiffUtil changePayload actions to avoid the list flickering --- .../app/activities/ManageFeedsActivity.java | 15 ++++- .../app/views/FeedWithFolderItem.java | 63 ++++++++++++------- 2 files changed, 55 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/com/readrops/app/activities/ManageFeedsActivity.java b/app/src/main/java/com/readrops/app/activities/ManageFeedsActivity.java index fff0c264..8f6d5d2a 100644 --- a/app/src/main/java/com/readrops/app/activities/ManageFeedsActivity.java +++ b/app/src/main/java/com/readrops/app/activities/ManageFeedsActivity.java @@ -104,7 +104,7 @@ public class ManageFeedsActivity extends AppCompatActivity { FeedWithFolder feedWithFolder1 = oldItem.getModel(); FeedWithFolder feedWithFolder2 = newItem.getModel(); - return feedWithFolder1.getFeed().getName().equals(feedWithFolder1.getFeed().getName()) && + return feedWithFolder1.getFeed().getName().equals(feedWithFolder2.getFeed().getName()) && feedWithFolder1.getFeed().getUrl().equals(feedWithFolder2.getFeed().getUrl()) && feedWithFolder1.getFolder().getName().equals(feedWithFolder2.getFolder().getName()); } @@ -112,7 +112,18 @@ public class ManageFeedsActivity extends AppCompatActivity { @Nullable @Override public Object getChangePayload(FeedWithFolderItem oldItem, int oldItemPosition, FeedWithFolderItem newItem, int newItemPosition) { - return null; + Bundle bundle = new Bundle(); + + if (!oldItem.getModel().getFeed().getName().equals(newItem.getModel().getFeed().getName())) + bundle.putString(FeedWithFolderItem.FEED_NAME_KEY, newItem.getModel().getFeed().getName()); + + if (!oldItem.getModel().getFolder().getName().equals(newItem.getModel().getFolder().getName())) + bundle.putString(FeedWithFolderItem.FOLDER_NAME_KEY, newItem.getModel().getFolder().getName()); + + if (bundle.size() > 0) + return bundle; + else + return null; } }); diff --git a/app/src/main/java/com/readrops/app/views/FeedWithFolderItem.java b/app/src/main/java/com/readrops/app/views/FeedWithFolderItem.java index 07c553b1..0e5c6a99 100644 --- a/app/src/main/java/com/readrops/app/views/FeedWithFolderItem.java +++ b/app/src/main/java/com/readrops/app/views/FeedWithFolderItem.java @@ -1,5 +1,6 @@ package com.readrops.app.views; +import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.view.View; @@ -16,6 +17,9 @@ import java.util.List; public class FeedWithFolderItem extends ModelAbstractItem { + public static final String FEED_NAME_KEY = "name"; + public static final String FOLDER_NAME_KEY = "folder_name"; + private ManageFeedsListener listener; public FeedWithFolderItem(FeedWithFolder feedWithFolder) { @@ -38,34 +42,51 @@ public class FeedWithFolderItem extends ModelAbstractItem payloads) { super.bindView(holder, payloads); - FeedWithFolder feedWithFolder = getModel(); + if (!payloads.isEmpty()) { + Bundle bundle = (Bundle)payloads.get(0); - if (feedWithFolder.getFeed().getIconUrl() != null) { - GlideApp.with(holder.itemView.getContext()) - .load(feedWithFolder.getFeed().getIconUrl()) - .diskCacheStrategy(DiskCacheStrategy.ALL) - .placeholder(R.drawable.ic_rss_feed) - .into(holder.feedIcon); - } else - holder.feedIcon.setImageResource(R.drawable.ic_rss_feed); + if (bundle.getString(FEED_NAME_KEY) != null) + holder.feedName.setText(bundle.getString(FEED_NAME_KEY)); - holder.feedName.setText(feedWithFolder.getFeed().getName()); - if (feedWithFolder.getFeed().getDescription() != null) { - holder.feedDescription.setVisibility(View.VISIBLE); - holder.feedDescription.setText(feedWithFolder.getFeed().getDescription()); - } else - holder.feedDescription.setVisibility(View.GONE); + if (bundle.getString(FOLDER_NAME_KEY) != null) + holder.folderName.setText(bundle.getString(FOLDER_NAME_KEY)); + } else { + FeedWithFolder feedWithFolder = getModel(); + + if (feedWithFolder.getFeed().getIconUrl() != null) { + GlideApp.with(holder.itemView.getContext()) + .load(feedWithFolder.getFeed().getIconUrl()) + .diskCacheStrategy(DiskCacheStrategy.ALL) + .placeholder(R.drawable.ic_rss_feed) + .into(holder.feedIcon); + } else + holder.feedIcon.setImageResource(R.drawable.ic_rss_feed); + + holder.feedName.setText(feedWithFolder.getFeed().getName()); + if (feedWithFolder.getFeed().getDescription() != null) { + holder.feedDescription.setVisibility(View.VISIBLE); + holder.feedDescription.setText(feedWithFolder.getFeed().getDescription()); + } else + holder.feedDescription.setVisibility(View.GONE); + + if (feedWithFolder.getFolder().getId() != 1) + holder.folderName.setText(feedWithFolder.getFolder().getName()); + else + holder.folderName.setText(holder.itemView.getResources().getString(R.string.no_folder)); + + holder.editFeed.setOnClickListener(v -> listener.onEdit(feedWithFolder)); + holder.deleteFeed.setOnClickListener(v -> listener.onDelete(feedWithFolder)); + } - if (feedWithFolder.getFolder().getId() != 1) - holder.folderName.setText(feedWithFolder.getFolder().getName()); - else - holder.folderName.setText(holder.itemView.getResources().getString(R.string.no_folder)); - holder.editFeed.setOnClickListener(v -> listener.onEdit(feedWithFolder)); - holder.deleteFeed.setOnClickListener(v -> listener.onDelete(feedWithFolder)); } public void setListener(ManageFeedsListener listener) {