From 174fa8c2af7f47f27a7f064843ac6b8eba394745 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Mon, 5 Jun 2017 23:07:58 +0300 Subject: [PATCH] rework article pager lazyload to be more similar to how headlines fragment does it run scroll-related refresh requests using runnable --- .../main/java/org/fox/ttrss/ArticlePager.java | 51 +++++++++++++------ .../java/org/fox/ttrss/HeadlinesFragment.java | 12 +++-- 2 files changed, 44 insertions(+), 19 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 c6133f8f..2a96a3a4 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 @@ -7,6 +7,7 @@ import android.os.BadParcelableException; import android.os.Bundle; import android.os.Handler; import android.preference.PreferenceManager; +import android.support.design.widget.Snackbar; import android.support.v4.app.ClassloaderWorkaroundFragmentStatePagerAdapter; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; @@ -38,6 +39,8 @@ public class ArticlePager extends Fragment { private Feed m_feed; private SharedPreferences m_prefs; private int m_firstId = 0; + private boolean m_refreshInProgress; + private boolean m_lazyLoadDisabled; private class PagerAdapter extends ClassloaderWorkaroundFragmentStatePagerAdapter { @@ -155,9 +158,15 @@ public class ArticlePager extends Fragment { //Log.d(TAG, "Page #" + position + "/" + m_adapter.getCount()); - if ((m_activity.isSmallScreen() || m_activity.isPortrait()) && position == m_adapter.getCount() - 15) { + if (!m_refreshInProgress && !m_lazyLoadDisabled && (m_activity.isSmallScreen() || m_activity.isPortrait()) && position >= m_adapter.getCount() - 5) { Log.d(TAG, "loading more articles..."); - refresh(true); + + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + refresh(true); + } + }, 100); } } } @@ -169,10 +178,20 @@ public class ArticlePager extends Fragment { @SuppressWarnings({ "serial" }) protected void refresh(boolean append) { - /* if (!m_feed.equals(Application.getInstance().m_activeFeed)) { - append = false; + // viewpager doesn't like it when there's no data to display so we can't really allow not-appending here + // luckily this fragment doesn't call for not-appending updates + // TODO: maybe later implement some placeholder fragment to show if there's no data + + /* if (!append) { + m_lazyLoadDisabled = false; + + // this won't ever work + m_articles.clear(); + m_adapter.notifyDataSetChanged(); } */ - + + m_refreshInProgress = true; + HeadlinesRequest req = new HeadlinesRequest(getActivity().getApplicationContext(), m_activity, m_feed, m_articles) { @Override protected void onProgressUpdate(Integer... progress) { @@ -184,16 +203,23 @@ public class ArticlePager extends Fragment { if (isDetached() || !isAdded()) return; super.onPostExecute(result); - + + m_refreshInProgress = false; + if (result != null) { - if (m_firstIdChanged && !(m_activity instanceof DetailActivity && !m_activity.isPortrait())) { - // TODO: show an information message in viewpager without modifying m_articles - //m_articles.add(new Article(HeadlinesFragment.ARTICLE_SPECIAL_TOP_CHANGED)); + if (m_firstIdChanged) { + m_lazyLoadDisabled = true; + } + if (m_firstIdChanged && !(m_activity instanceof DetailActivity && !m_activity.isPortrait())) { m_activity.toast(R.string.headlines_row_top_changed); } + if (m_amountLoaded < HeadlinesFragment.HEADLINES_REQUEST_SIZE) { + m_lazyLoadDisabled = true; + } + ArticlePager.this.m_firstId = m_firstId; try { @@ -323,13 +349,8 @@ public class ArticlePager extends Fragment { @Override public void onResume() { super.onResume(); - - /* if (m_articles.size() == 0 || !m_feed.equals(Application.getInstance().m_activeFeed)) { - refresh(false); - Application.getInstance().m_activeFeed = m_feed; - } */ - if (m_adapter != null) m_adapter.notifyDataSetChanged(); + //if (m_adapter != null) m_adapter.notifyDataSetChanged(); m_activity.invalidateOptionsMenu(); } diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java index f2e9f9f0..82450961 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java @@ -488,8 +488,6 @@ public class HeadlinesFragment extends Fragment { }, 100); } } - - } @Override @@ -529,7 +527,13 @@ public class HeadlinesFragment extends Fragment { //Log.d(TAG, "onScrolled: " + m_refreshInProgress + " " + m_lazyLoadDisabled + " " + lastVisibleItem + " " + m_articles.size()); if (!m_refreshInProgress && !m_lazyLoadDisabled && lastVisibleItem >= m_articles.size() - 5) { - refresh(true); + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + refresh(true); + } + }, 100); + } } @@ -615,9 +619,9 @@ public class HeadlinesFragment extends Fragment { if (m_swipeLayout != null) m_swipeLayout.setRefreshing(false); //m_adapter.removeAllFooterViews(); + m_refreshInProgress = false; if (result != null) { - m_refreshInProgress = false; if (m_activeArticle != null && !m_articles.containsId(m_activeArticle.id)) { m_activeArticle = null;