diff options
| author | Andrew Dolgov <fox@fakecake.org> | 2025-05-14 09:56:10 +0300 |
|---|---|---|
| committer | Andrew Dolgov <fox@fakecake.org> | 2025-05-14 09:56:10 +0300 |
| commit | 9da98b2abb5eddfec8c8a5ef51f5bdbbcaeecf21 (patch) | |
| tree | 5a8566e3db68f091fc6a32477ccd229316566d89 | |
| parent | d260fc8072a8f89e6b31262483a20638fa7936c1 (diff) | |
switch to asyncdiff implementation of pager adapter
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(); + } +} + |