summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Dolgov <fox@fakecake.org>2025-05-14 09:14:30 +0300
committerAndrew Dolgov <fox@fakecake.org>2025-05-14 09:14:30 +0300
commitd260fc8072a8f89e6b31262483a20638fa7936c1 (patch)
treee9a5ffe5621bc7ae08648f1a15ef70a85b9ffe52
parent964a5b76b78e2d573924b7b15b6f404dcdabad1e (diff)
switch to recycler listview/submitlist
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java94
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesLoader.java2
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/MasterActivity.java6
-rw-r--r--org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesDiffItemCallback.java23
-rw-r--r--org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesDiffUtilCallback.java2
-rwxr-xr-xorg.fox.ttrss/src/main/res/layout/fragment_headlines.xml1
6 files changed, 48 insertions, 80 deletions
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 9674cf2a..d0f4fa94 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
@@ -52,10 +52,9 @@ import androidx.loader.app.LoaderManager;
import androidx.loader.content.Loader;
import androidx.preference.PreferenceManager;
import androidx.recyclerview.widget.DefaultItemAnimator;
-import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
-import androidx.recyclerview.widget.ListUpdateCallback;
+import androidx.recyclerview.widget.ListAdapter;
import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
@@ -76,7 +75,7 @@ import org.fox.ttrss.types.Article;
import org.fox.ttrss.types.ArticleList;
import org.fox.ttrss.types.Attachment;
import org.fox.ttrss.types.Feed;
-import org.fox.ttrss.util.HeadlinesDiffUtilCallback;
+import org.fox.ttrss.util.HeadlinesDiffItemCallback;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
@@ -89,7 +88,6 @@ import jp.wasabeef.glide.transformations.CropCircleTransformation;
public class HeadlinesFragment extends androidx.fragment.app.Fragment implements LoaderManager.LoaderCallbacks<ArticleList> {
- private ArticleList m_articles = new ArticleList();
private boolean m_isLazyLoading;
@NonNull
@@ -106,52 +104,30 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment implements
// successful update
if (data != null) {
+
// shared article list contains raw returned data without footers
ArticleList sharedArticles = Application.getArticles();
sharedArticles.clear();
sharedArticles.addAll(data);
ArticleList tmp = new ArticleList();
- tmp.addAll(data);
-
- tmp.add(new Article(Article.TYPE_AMR_FOOTER));
-
- DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new HeadlinesDiffUtilCallback(m_articles, tmp));
-
- /* diffResult.dispatchUpdatesTo(new ListUpdateCallback() {
- @Override
- public void onInserted(int position, int count) {
- Log.d(TAG, "[DIFF] onInserted! pos=" + position + " count=" + count);
- }
- @Override
- public void onRemoved(int position, int count) {
- Log.d(TAG, "[DIFF] onRemoved! pos=" + position + " count=" + count);
- }
-
- @Override
- public void onMoved(int fromPosition, int toPosition) {
- Log.d(TAG, "[DIFF] onMoved! from=" + fromPosition + " to=" + toPosition);
- }
+ tmp.addAll(data);
- @Override
- public void onChanged(int position, int count, @Nullable Object payload) {
- Log.d(TAG, "[DIFF] onChanged! pos=" + position + " count=" + count + " payload=" + payload);
- }
- }); */
+ if (m_prefs.getBoolean("headlines_mark_read_scroll", false))
+ tmp.add(new Article(Article.TYPE_AMR_FOOTER));
- m_articles.clear();
- m_articles.addAll(tmp);
+ final boolean appended = headlinesLoader.getAppend();
- diffResult.dispatchUpdatesTo(m_adapter);
+ m_adapter.submitList(tmp, () -> {
+ if (!appended)
+ m_list.scrollToPosition(0);
+ });
if (headlinesLoader.getFirstIdChanged())
Snackbar.make(getView(), R.string.headlines_row_top_changed, Snackbar.LENGTH_LONG)
.setAction(R.string.reload, v -> refresh(false)).show();
- if (!headlinesLoader.getAppend())
- m_list.scrollToPosition(0);
-
m_listener.onHeadlinesLoaded(headlinesLoader.getAppend());
} else {
@@ -393,7 +369,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment implements
m_list.setLayoutManager(m_layoutManager);
m_list.setItemAnimator(new DefaultItemAnimator());
- m_adapter = new ArticleListAdapter(m_articles);
+ m_adapter = new ArticleListAdapter();
m_list.setAdapter(m_adapter);
if (savedInstanceState == null && Application.getArticles().isEmpty()) {
@@ -577,16 +553,9 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment implements
if (!append) {
m_activeArticleId = -1;
- int size = m_articles.size();
-
- m_articles.clear();
-
if (m_adapter != null) {
- m_adapter.notifyItemRangeRemoved(0, size);
-
- m_articles.add(new Article(Article.TYPE_AMR_FOOTER));
-
- m_adapter.notifyItemRangeInserted(0, m_articles.size());
+ ArticleList tmp = new ArticleList();
+ m_adapter.submitList(tmp);
}
}
@@ -705,14 +674,12 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment implements
}
}
- private class ArticleListAdapter extends RecyclerView.Adapter<ArticleViewHolder> {
- private final ArticleList items;
-
+ private class ArticleListAdapter extends ListAdapter<Article, ArticleViewHolder> {
public static final int VIEW_NORMAL = 0;
public static final int VIEW_UNREAD = 1;
public static final int VIEW_ACTIVE = 2;
public static final int VIEW_ACTIVE_UNREAD = 3;
- public static final int VIEW_AMR_FOOTER = 5;
+ public static final int VIEW_AMR_FOOTER = 4;
public static final int VIEW_COUNT = VIEW_AMR_FOOTER + 1;
@@ -744,9 +711,8 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment implements
return false;
}
- public ArticleListAdapter(ArticleList items) {
- super();
- this.items = items;
+ public ArticleListAdapter() {
+ super(new HeadlinesDiffItemCallback());
Display display = m_activity.getWindowManager().getDefaultDisplay();
Point size = new Point();
@@ -788,7 +754,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment implements
@Override
public void onBindViewHolder(final ArticleViewHolder holder, int position) {
- holder.article = items.get(position);
+ holder.article = getItem(position);
int headlineFontSize = m_prefs.getInt("headlines_font_size_sp_int", 13);
int headlineSmallFontSize = Math.max(10, Math.min(18, headlineFontSize - 2));
@@ -1318,7 +1284,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment implements
@Override
public int getItemViewType(int position) {
- Article a = items.get(position);
+ Article a = getItem(position);
if (a.id == Article.TYPE_AMR_FOOTER) {
return VIEW_AMR_FOOTER;
@@ -1333,11 +1299,6 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment implements
}
}
- @Override
- public int getItemCount() {
- return items.size();
- }
-
private void updateTextCheckedState(final ArticleViewHolder holder, final Article article) {
String tmp = !article.title.isEmpty() ? article.title.substring(0, 1).toUpperCase() : "?";
@@ -1473,10 +1434,6 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment implements
}
}
- public void notifyUpdated() {
- m_adapter.notifyDataSetChanged();
- }
-
public void scrollToArticle(Article article) {
scrollToArticleId(article.id);
}
@@ -1562,16 +1519,13 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment implements
private void syncToSharedArticles() {
ArticleList tmp = new ArticleList();
- tmp.addAll(Application.getArticles());
-
- tmp.add(new Article(Article.TYPE_AMR_FOOTER));
- DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new HeadlinesDiffUtilCallback(m_articles, tmp));
+ tmp.addAll(Application.getArticles());
- m_articles.clear();
- m_articles.addAll(tmp);
+ if (m_prefs.getBoolean("headlines_mark_read_scroll", false))
+ tmp.add(new Article(Article.TYPE_AMR_FOOTER));
- diffResult.dispatchUpdatesTo(m_adapter);
+ m_adapter.submitList(tmp);
}
}
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesLoader.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesLoader.java
index a7755f5b..38ae19f4 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesLoader.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesLoader.java
@@ -68,7 +68,7 @@ public class HeadlinesLoader extends AsyncTaskLoader<ArticleList> implements Api
m_append = true;
forceLoad();
} else {
- deliverResult(m_articles);
+ reset();
}
}
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 33d949f7..fcca41bb 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
@@ -521,15 +521,9 @@ public class MasterActivity extends OnlineActivity implements HeadlinesEventList
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == HEADLINES_REQUEST) {
- // we add back footers stripped when this was passed to DetailActivity
- // Application.getArticles().add(new Article(Article.TYPE_AMR_FOOTER));
-
HeadlinesFragment hf = (HeadlinesFragment) getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES);
if (hf != null) {
- // articles might've been changed while in detail activity (resync with shared articles is handled in fragment onResume)
- //hf.notifyUpdated();
-
// data might be null if detailactivity crashed
if (data != null) {
int activeArticleId = data.getIntExtra("activeArticleId", 0);
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesDiffItemCallback.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesDiffItemCallback.java
new file mode 100644
index 00000000..b652946a
--- /dev/null
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesDiffItemCallback.java
@@ -0,0 +1,23 @@
+package org.fox.ttrss.util;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.DiffUtil;
+
+import org.fox.ttrss.types.Article;
+
+public class HeadlinesDiffItemCallback extends DiffUtil.ItemCallback<Article> {
+ @Override
+ public boolean areItemsTheSame(@NonNull Article a1, @NonNull Article a2) {
+ // Log.d(TAG, "[DIFF] areItemsTheSame a1=" + a1.title + " a2=" + a2.title);
+
+ return a1.id == a2.id;
+ }
+
+ @Override
+ public boolean areContentsTheSame(@NonNull Article a1, @NonNull Article a2) {
+ // Log.d(TAG, "[DIFF] areContentsTheSame a1=" + a1.title + " a2=" + a2.title);
+
+ return a1.id == a2.id && a1.unread == a2.unread && a1.marked == a2.marked
+ && a1.published == a2.published && a1.note.equals(a2.note);
+ }
+}
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesDiffUtilCallback.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesDiffUtilCallback.java
index e1292f99..084fb9fc 100644
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesDiffUtilCallback.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesDiffUtilCallback.java
@@ -1,7 +1,5 @@
package org.fox.ttrss.util;
-import android.util.Log;
-
import androidx.recyclerview.widget.DiffUtil;
import org.fox.ttrss.types.Article;
diff --git a/org.fox.ttrss/src/main/res/layout/fragment_headlines.xml b/org.fox.ttrss/src/main/res/layout/fragment_headlines.xml
index 2783a1e4..647c3ae9 100755
--- a/org.fox.ttrss/src/main/res/layout/fragment_headlines.xml
+++ b/org.fox.ttrss/src/main/res/layout/fragment_headlines.xml
@@ -12,7 +12,6 @@
<org.fox.ttrss.util.ContextMenuRecyclerView
android:id="@+id/headlines_list"
android:background="?colorSurfaceContainer"
- android:drawSelectorOnTop="true"
android:scrollbars="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent" />