diff options
| author | Andrew Dolgov <fox@fakecake.org> | 2025-05-12 10:33:38 +0300 |
|---|---|---|
| committer | Andrew Dolgov <fox@fakecake.org> | 2025-05-12 10:33:38 +0300 |
| commit | 03a046da31b6f3333294f5046b76687a9b7f6e6a (patch) | |
| tree | ba856fdfc883b8be836fc7dd537152fd9c387466 | |
| parent | dac515e79b40b9a3dbc2b05f216480b72fea11bb (diff) | |
drop unused recycler adapter with headers, minor cleanup of other stuff
5 files changed, 22 insertions, 257 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 5bef0dd2..dcd378d5 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 @@ -15,7 +15,6 @@ import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; import androidx.preference.PreferenceManager; -import androidx.recyclerview.widget.RecyclerView; import androidx.viewpager2.adapter.FragmentStateAdapter; import androidx.viewpager2.widget.ViewPager2; @@ -156,7 +155,7 @@ public class ArticlePager extends androidx.fragment.app.Fragment { m_refreshInProgress = true; - @SuppressLint("StaticFieldLeak") HeadlinesRequest req = new HeadlinesRequest(getActivity().getApplicationContext(), m_activity, m_feed, Application.getArticles()) { + @SuppressLint("StaticFieldLeak") HeadlinesRequest req = new HeadlinesRequest(getActivity().getApplicationContext(), m_activity, Application.getArticles()) { @Override protected void onPostExecute(JsonElement result) { if (isDetached() || !isAdded()) return; 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 32943961..215c379e 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 @@ -72,7 +72,6 @@ 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.HeaderViewRecyclerAdapter; import org.fox.ttrss.util.HeadlinesRequest; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; @@ -105,7 +104,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { private SharedPreferences m_prefs; - private HeaderViewRecyclerAdapter m_adapter; + private ArticleListAdapter m_adapter; private final ArticleList m_readArticles = new ArticleList(); private HeadlinesEventListener m_listener; private OnlineActivity m_activity; @@ -216,7 +215,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { if (info != null) { - Article article = getArticleAtPosition(info.position - m_adapter.getHeaderCount()); + Article article = getArticleAtPosition(info.position); if (!onArticleMenuItemSelected(item, article, info.position)) return super.onContextItemSelected(item); @@ -300,9 +299,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { m_list.setLayoutManager(m_layoutManager); m_list.setItemAnimator(new DefaultItemAnimator()); - ArticleListAdapter adapter = new ArticleListAdapter(Application.getArticles()); - - m_adapter = new HeaderViewRecyclerAdapter(adapter); + m_adapter = new ArticleListAdapter(Application.getArticles()); m_list.setAdapter(m_adapter); @@ -318,7 +315,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { @Override public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { - int position = viewHolder.getBindingAdapterPosition() - m_adapter.getHeaderCount(); + int position = viewHolder.getBindingAdapterPosition(); Article article = getArticleAtPosition(position); @@ -332,10 +329,9 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { final int adapterPosition = viewHolder.getBindingAdapterPosition(); - final int position = adapterPosition - m_adapter.getHeaderCount(); - try { - final Article article = getArticleAtPosition(position); + try { + final Article article = getArticleAtPosition(adapterPosition); final boolean wasUnread; if (article != null && article.id > 0) { @@ -348,7 +344,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { wasUnread = false; } - Application.getArticles().remove(position); + Application.getArticles().remove(adapterPosition); m_adapter.notifyDataSetChanged(); Snackbar.make(m_list, R.string.headline_undo_row_prompt, Snackbar.LENGTH_LONG) @@ -359,7 +355,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { m_activity.saveArticleUnread(article); } - Application.getArticles().add(position, article); + Application.getArticles().add(adapterPosition, article); m_adapter.notifyItemInserted(adapterPosition); m_adapter.notifyItemRangeChanged(adapterPosition, 1); }).show(); @@ -400,11 +396,11 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { //Log.d(TAG, "onScrolled: FVI=" + firstVisibleItem + " LVI=" + lastVisibleItem); - if (m_prefs.getBoolean("headlines_mark_read_scroll", false) && firstVisibleItem > m_adapter.getHeaderCount()) { + if (m_prefs.getBoolean("headlines_mark_read_scroll", false) && firstVisibleItem > 0) { - if (firstVisibleItem <= Application.getArticles().size() + m_adapter.getHeaderCount()) { + if (firstVisibleItem <= Application.getArticles().size()) { - Article a = getArticleAtPosition(firstVisibleItem - m_adapter.getHeaderCount() - 1); + Article a = getArticleAtPosition(firstVisibleItem); if (a != null && a.unread) { Log.d(TAG, "title=" + a.title); @@ -487,7 +483,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { final String sessionId = m_activity.getSessionId(); final boolean isCat = m_feed.is_cat; - @SuppressLint("StaticFieldLeak") HeadlinesRequest req = new HeadlinesRequest(getActivity().getApplicationContext(), m_activity, m_feed, Application.getArticles()) { + @SuppressLint("StaticFieldLeak") HeadlinesRequest req = new HeadlinesRequest(getActivity().getApplicationContext(), m_activity, Application.getArticles()) { @Override protected void onPostExecute(JsonElement result) { if (isDetached() || !isAdded()) return; @@ -1575,7 +1571,7 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment { public int getArticlePositionById(int id) { for (int i = 0; i < Application.getArticles().size(); i++) { if (Application.getArticles().get(i).id == id) { - return i + m_adapter.getHeaderCount(); + return i; } } diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/types/ArticleList.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/types/ArticleList.java index bd108b25..d18a1233 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/types/ArticleList.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/types/ArticleList.java @@ -3,6 +3,7 @@ package org.fox.ttrss.types; import android.os.Parcel; import android.os.Parcelable; +import java.util.ListIterator; import java.util.concurrent.CopyOnWriteArrayList; import java.util.stream.Collectors; @@ -43,15 +44,15 @@ public class ArticleList extends CopyOnWriteArrayList<Article> implements Parcel readFromParcel(in); } + /** strips all trailing items with negative IDs (Article.TYPE_LOADMORE, Article.TYPE_AMR_FOOTER) */ public void stripFooters() { - for (int i = this.size()-1; i >= 0; i--) { - Article a = this.get(i); + for (ListIterator<Article> iterator = this.listIterator(size()); iterator.hasPrevious();) { + final Article article = iterator.previous(); - if (a.id < 0) { - this.remove(a); - } else if (a.id > 0) { + if (article.id < 0) + this.remove(article); + else break; - } } } diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeaderViewRecyclerAdapter.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeaderViewRecyclerAdapter.java deleted file mode 100755 index 898cad88..00000000 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeaderViewRecyclerAdapter.java +++ /dev/null @@ -1,220 +0,0 @@ -package org.fox.ttrss.util; - -/* - * Copyright (C) 2014 darnmason - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import android.view.View; -import android.view.ViewGroup; - -import androidx.recyclerview.widget.RecyclerView; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * <p> - * RecyclerView adapter designed to wrap an existing adapter allowing the addition of - * header views and footer views. - * </p> - * <p> - * I implemented it to aid with the transition from ListView to RecyclerView where the ListView's - * addHeaderView and addFooterView methods were used. Using this class you may initialize your - * header views in the Fragment/Activity and add them to the adapter in the same way you used to - * add them to a ListView. - * </p> - * <p> - * I also required to be able to swap out multiple adapters with different content, therefore - * setAdapter may be called multiple times. - * </p> - * Created by darnmason on 07/11/2014. - */ -public class HeaderViewRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { - - private static final int HEADERS_START = Integer.MIN_VALUE; - private static final int FOOTERS_START = Integer.MIN_VALUE + 10; - private static final int ITEMS_START = Integer.MIN_VALUE + 20; - private static final int ADAPTER_MAX_TYPES = 100; - - private RecyclerView.Adapter mWrappedAdapter; - private final List<View> mHeaderViews; - private final List<View> mFooterViews; - private final Map<Class, Integer> mItemTypesOffset; - - /** - * Construct a new header view recycler adapter - * @param adapter The underlying adapter to wrap - */ - public HeaderViewRecyclerAdapter(RecyclerView.Adapter adapter) { - mHeaderViews = new ArrayList<>(); - mFooterViews = new ArrayList<>(); - mItemTypesOffset = new HashMap<>(); - setWrappedAdapter(adapter); - } - - /** - * Replaces the underlying adapter, notifying RecyclerView of changes - * @param adapter The new adapter to wrap - */ - public void setAdapter(RecyclerView.Adapter adapter) { - if(mWrappedAdapter != null && mWrappedAdapter.getItemCount() > 0) { - notifyItemRangeRemoved(getHeaderCount(), mWrappedAdapter.getItemCount()); - } - setWrappedAdapter(adapter); - notifyItemRangeInserted(getHeaderCount(), mWrappedAdapter.getItemCount()); - } - - @Override - public int getItemViewType(int position) { - int hCount = getHeaderCount(); - if (position < hCount) return HEADERS_START + position; - else { - int itemCount = mWrappedAdapter.getItemCount(); - if (position < hCount + itemCount) { - return getAdapterTypeOffset() + mWrappedAdapter.getItemViewType(position - hCount); - } - else return FOOTERS_START + position - hCount - itemCount; - } - } - - @Override - public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { - if (viewType < HEADERS_START + getHeaderCount()) - return new StaticViewHolder(mHeaderViews.get(viewType - HEADERS_START)); - else if (viewType < FOOTERS_START + getFooterCount()) - return new StaticViewHolder(mFooterViews.get(viewType - FOOTERS_START)); - else { - return mWrappedAdapter.onCreateViewHolder(viewGroup, viewType - getAdapterTypeOffset()); - } - } - - @Override - public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) { - int hCount = getHeaderCount(); - if (position >= hCount && position < hCount + mWrappedAdapter.getItemCount()) - mWrappedAdapter.onBindViewHolder(viewHolder, position - hCount); - } - - /** - * Add a static view to appear at the start of the RecyclerView. Headers are displayed in the - * order they were added. - * @param view The header view to add - */ - public void addHeaderView(View view) { - mHeaderViews.add(view); - } - - /** - * Add a static view to appear at the end of the RecyclerView. Footers are displayed in the - * order they were added. - * @param view The footer view to add - */ - public void addFooterView(View view) { - mFooterViews.add(view); - } - - public void removeFooterView(View view) { - mFooterViews.remove(view); - } - - public void removeAllFooterViews() { - mFooterViews.clear(); - } - - @Override - public int getItemCount() { - return getHeaderCount() + getFooterCount() + getWrappedItemCount(); - } - - /** - * @return The item count in the underlying adapter - */ - public int getWrappedItemCount() { - return mWrappedAdapter.getItemCount(); - } - - /** - * @return The number of header views added - */ - public int getHeaderCount() { - return mHeaderViews.size(); - } - - /** - * @return The number of footer views added - */ - public int getFooterCount() { - return mFooterViews.size(); - } - - private void setWrappedAdapter(RecyclerView.Adapter adapter) { - if (mWrappedAdapter != null) mWrappedAdapter.unregisterAdapterDataObserver(mDataObserver); - mWrappedAdapter = adapter; - Class adapterClass = mWrappedAdapter.getClass(); - if(!mItemTypesOffset.containsKey(adapterClass)) putAdapterTypeOffset(adapterClass); - mWrappedAdapter.registerAdapterDataObserver(mDataObserver); - } - - private void putAdapterTypeOffset(Class adapterClass) { - mItemTypesOffset.put(adapterClass, ITEMS_START + mItemTypesOffset.size() * ADAPTER_MAX_TYPES); - } - - private int getAdapterTypeOffset() { - return mItemTypesOffset.get(mWrappedAdapter.getClass()); - } - - private final RecyclerView.AdapterDataObserver mDataObserver = new RecyclerView.AdapterDataObserver() { - @Override - public void onChanged() { - super.onChanged(); - notifyDataSetChanged(); - } - - @Override - public void onItemRangeChanged(int positionStart, int itemCount) { - super.onItemRangeChanged(positionStart, itemCount); - notifyItemRangeChanged(positionStart + getHeaderCount(), itemCount); - } - - @Override - public void onItemRangeInserted(int positionStart, int itemCount) { - super.onItemRangeInserted(positionStart, itemCount); - notifyItemRangeInserted(positionStart + getHeaderCount(), itemCount); - } - - @Override - public void onItemRangeRemoved(int positionStart, int itemCount) { - super.onItemRangeRemoved(positionStart, itemCount); - notifyItemRangeRemoved(positionStart + getHeaderCount(), itemCount); - } - - @Override - public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) { - super.onItemRangeMoved(fromPosition, toPosition, itemCount); - int hCount = getHeaderCount(); - // TODO: No notifyItemRangeMoved method? - notifyItemRangeChanged(fromPosition + hCount, toPosition + hCount + itemCount); - } - }; - - private static class StaticViewHolder extends RecyclerView.ViewHolder { - - public StaticViewHolder(View itemView) { - super(itemView); - } - } -} diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesRequest.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesRequest.java index 49883d23..dd4d45ac 100755 --- a/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesRequest.java +++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/util/HeadlinesRequest.java @@ -15,7 +15,6 @@ import org.fox.ttrss.HeadlinesFragment; import org.fox.ttrss.OnlineActivity; import org.fox.ttrss.types.Article; import org.fox.ttrss.types.ArticleList; -import org.fox.ttrss.types.Feed; import java.lang.reflect.Type; import java.util.List; @@ -26,30 +25,20 @@ public class HeadlinesRequest extends ApiRequest { private int m_offset = 0; private final OnlineActivity m_activity; private final ArticleList m_articles; // = new ArticleList(); //Application.getInstance().m_loadedArticles; - private final Feed m_feed; - protected boolean m_firstIdChanged = false; protected int m_firstId = 0; protected int m_amountLoaded = 0; - public HeadlinesRequest(Context context, OnlineActivity activity, final Feed feed, ArticleList articles) { + public HeadlinesRequest(Context context, OnlineActivity activity, ArticleList articles) { super(context); m_articles = articles; m_activity = activity; - m_feed = feed; } protected void onPostExecute(JsonElement result) { if (result != null) { try { - - // check if we are returning results for correct feed - /* if (Application.getInstance().m_activeFeed != null && !m_feed.equals(Application.getInstance().m_activeFeed)) { - Log.d(TAG, "received results for wrong feed, bailing out."); - return; - } */ - JsonArray content = result.getAsJsonArray(); if (content != null) { final List<Article> articles; |