summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Dolgov <fox@fakecake.org>2025-05-14 09:56:10 +0300
committerAndrew Dolgov <fox@fakecake.org>2025-05-14 09:56:10 +0300
commit9da98b2abb5eddfec8c8a5ef51f5bdbbcaeecf21 (patch)
tree5a8566e3db68f091fc6a32477ccd229316566d89
parentd260fc8072a8f89e6b31262483a20638fa7936c1 (diff)
switch to asyncdiff implementation of pager adapter
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/ArticlePager.java39
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/DetailActivity.java6
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/MasterActivity.java2
-rw-r--r--org.fox.ttrss/src/main/java/org/fox/ttrss/util/DiffFragmentStateAdapter.java54
4 files changed, 75 insertions, 26 deletions
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticlePager.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticlePager.java
index 016bc370..46c42768 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticlePager.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticlePager.java
@@ -17,11 +17,13 @@ import androidx.viewpager2.widget.ViewPager2;
import org.fox.ttrss.types.Article;
import org.fox.ttrss.types.ArticleList;
import org.fox.ttrss.types.Feed;
+import org.fox.ttrss.util.DiffFragmentStateAdapter;
+import org.fox.ttrss.util.HeadlinesDiffItemCallback;
import org.fox.ttrss.util.HeadlinesDiffUtilCallback;
public class ArticlePager extends androidx.fragment.app.Fragment {
- private final String TAG = "ArticlePager";
+ private final String TAG = this.getClass().getSimpleName();
private PagerAdapter m_adapter;
private HeadlinesEventListener m_listener;
private int m_articleId;
@@ -29,44 +31,39 @@ public class ArticlePager extends androidx.fragment.app.Fragment {
private Feed m_feed;
private ViewPager2 m_pager;
- private static class PagerAdapter extends FragmentStateAdapter {
- private ArticleList m_articles = new ArticleList();
+ private class PagerAdapter extends DiffFragmentStateAdapter<Article> {
- public PagerAdapter(@NonNull Fragment fragment, ArticleList initialArticles) {
- super(fragment);
+ public PagerAdapter(@NonNull Fragment fragment) {
+ super(fragment, new HeadlinesDiffItemCallback());
- m_articles.clear();
- m_articles.addAll(initialArticles);
+ syncToSharedArticles();
}
private void syncToSharedArticles() {
+ Log.d(TAG, "syncToSharedArticles");
+
ArticleList tmp = new ArticleList();
tmp.addAll(Application.getArticles());
- DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new HeadlinesDiffUtilCallback(m_articles, tmp));
+ Log.d(TAG, "shared size=" + Application.getArticles().size() + " local size=" + getItemCount());
- diffResult.dispatchUpdatesTo(this);
+ for (Article a : tmp) {
+ Log.d(TAG, a.title);
+ }
- m_articles.clear();
- m_articles.addAll(tmp);
+ submitList(tmp);
}
@Override
@NonNull
public Fragment createFragment(int position) {
- Article article = m_articles.get(position);
+ Article article = getItem(position);
ArticleFragment af = new ArticleFragment();
af.initialize(article);
return af;
}
-
- @Override
- public int getItemCount() {
- return m_articles.size();
- }
-
}
public void initialize(int articleId, Feed feed) {
@@ -98,7 +95,7 @@ public class ArticlePager extends androidx.fragment.app.Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_article_pager, container, false);
- m_adapter = new PagerAdapter(this, Application.getArticles());
+ m_adapter = new PagerAdapter(this);
m_pager = view.findViewById(R.id.article_pager);
@@ -186,10 +183,6 @@ public class ArticlePager extends androidx.fragment.app.Fragment {
m_adapter.notifyItemChanged(position);
}
- public void notifyUpdated() {
- m_adapter.notifyDataSetChanged();
- }
-
public void syncToSharedArticles() {
if (m_adapter != null)
m_adapter.syncToSharedArticles();
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/DetailActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/DetailActivity.java
index b0f5796d..ed237fed 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/DetailActivity.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/DetailActivity.java
@@ -299,11 +299,11 @@ public class DetailActivity extends OnlineActivity implements HeadlinesEventList
HeadlinesFragment hf = (HeadlinesFragment) getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES);
ArticlePager ap = (ArticlePager) getSupportFragmentManager().findFragmentByTag(FRAG_ARTICLE);
- if (ap != null) {
+ if (ap != null) {
ap.syncToSharedArticles();
}
- if (hf != null) {
+ /* if (hf != null) {
Article article = Application.getArticles().getById(hf.getActiveArticleId());
if (article == null && !Application.getArticles().isEmpty()) {
@@ -321,7 +321,7 @@ public class DetailActivity extends OnlineActivity implements HeadlinesEventList
ft.replace(R.id.article_fragment, af, FRAG_ARTICLE);
ft.commitAllowingStateLoss();
}
- }
+ } */
}
@Override
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/MasterActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/MasterActivity.java
index fcca41bb..452c720b 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/MasterActivity.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/MasterActivity.java
@@ -520,6 +520,8 @@ public class MasterActivity extends OnlineActivity implements HeadlinesEventList
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
+ Log.d(TAG, "onActivityResult:" + requestCode + " "+ resultCode + " " + data);
+
if (requestCode == HEADLINES_REQUEST) {
HeadlinesFragment hf = (HeadlinesFragment) getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES);
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/DiffFragmentStateAdapter.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/DiffFragmentStateAdapter.java
new file mode 100644
index 00000000..c423b02d
--- /dev/null
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/DiffFragmentStateAdapter.java
@@ -0,0 +1,54 @@
+package org.fox.ttrss.util;
+
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
+import androidx.fragment.app.FragmentManager;
+import androidx.lifecycle.Lifecycle;
+import androidx.recyclerview.widget.AsyncListDiffer;
+import androidx.recyclerview.widget.DiffUtil;
+import androidx.viewpager2.adapter.FragmentStateAdapter;
+
+import java.util.List;
+
+// https://gist.github.com/Gnzlt/7e8a23ba0c3b046ed33c824b284d7270
+public abstract class DiffFragmentStateAdapter<T> extends FragmentStateAdapter {
+
+ private final AsyncListDiffer<T> differ;
+
+ protected DiffFragmentStateAdapter(FragmentActivity fragmentActivity, DiffUtil.ItemCallback<T> diffCallback) {
+ super(fragmentActivity);
+ differ = new AsyncListDiffer<>(this, diffCallback);
+ }
+
+ protected DiffFragmentStateAdapter(Fragment fragment, DiffUtil.ItemCallback<T> diffCallback) {
+ super(fragment);
+ differ = new AsyncListDiffer<>(this, diffCallback);
+ }
+
+ protected DiffFragmentStateAdapter(FragmentManager fragmentManager, Lifecycle lifecycle, DiffUtil.ItemCallback<T> diffCallback) {
+ super(fragmentManager, lifecycle);
+ differ = new AsyncListDiffer<>(this, diffCallback);
+ }
+
+ public void submitList(List<T> list, Runnable commitCallback) {
+ differ.submitList(list, commitCallback);
+ }
+
+ public void submitList(List<T> list) {
+ differ.submitList(list, null);
+ }
+
+ public List<T> getCurrentList() {
+ return differ.getCurrentList();
+ }
+
+ protected T getItem(int position) {
+ return differ.getCurrentList().get(position);
+ }
+
+ @Override
+ public int getItemCount() {
+ return differ.getCurrentList().size();
+ }
+}
+