From 1c5de8792448871c2049cfd2d624d7dffc00b303 Mon Sep 17 00:00:00 2001 From: Christine Coenen Date: Thu, 4 Jul 2024 11:47:32 +0200 Subject: [PATCH 1/3] Fix inaccurate scroll bar due to lazy loading #1232 Signed-off-by: Christine Coenen --- .../LazyLoadingLinearLayoutManager.kt | 23 +++++++++++++++++++ .../NewsReaderDetailFragment.java | 2 +- .../adapter/NewsListRecyclerAdapter.java | 21 +++++++++++------ 3 files changed, 38 insertions(+), 8 deletions(-) create mode 100644 News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/LazyLoadingLinearLayoutManager.kt diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/LazyLoadingLinearLayoutManager.kt b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/LazyLoadingLinearLayoutManager.kt new file mode 100644 index 000000000..227d5e3c8 --- /dev/null +++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/LazyLoadingLinearLayoutManager.kt @@ -0,0 +1,23 @@ +package de.luhmer.owncloudnewsreader + +import android.content.Context +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import kotlin.math.roundToInt + +class LazyLoadingLinearLayoutManager( + context: Context?, + @RecyclerView.Orientation orientation: Int, + reverseLayout: Boolean +) : LinearLayoutManager(context, orientation, reverseLayout) { + + var totalItemCount: Int = 0 + + override fun computeVerticalScrollRange(state: RecyclerView.State): Int { + if (state.itemCount == 0) { + return 0 + } + + return (super.computeVerticalScrollRange(state) / state.itemCount.toFloat() * totalItemCount).roundToInt() + } +} diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsReaderDetailFragment.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsReaderDetailFragment.java index 8a31949a9..ebe68bdb9 100644 --- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsReaderDetailFragment.java +++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/NewsReaderDetailFragment.java @@ -326,7 +326,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, binding = FragmentNewsreaderDetailBinding.inflate(inflater, container, false); binding.list.setHasFixedSize(true); - binding.list.setLayoutManager(new LinearLayoutManager(mActivity, RecyclerView.VERTICAL, false)); + binding.list.setLayoutManager(new LazyLoadingLinearLayoutManager(mActivity, RecyclerView.VERTICAL, false)); binding.list.setItemAnimator(new DefaultItemAnimator()); ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new NewsReaderItemTouchHelperCallback()); diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/adapter/NewsListRecyclerAdapter.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/adapter/NewsListRecyclerAdapter.java index 92ace3a39..f7c6b7845 100644 --- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/adapter/NewsListRecyclerAdapter.java +++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/adapter/NewsListRecyclerAdapter.java @@ -10,7 +10,6 @@ import androidx.annotation.NonNull; import androidx.fragment.app.FragmentActivity; -import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; @@ -24,6 +23,7 @@ import de.luhmer.owncloudnewsreader.NewsReaderListActivity; import de.luhmer.owncloudnewsreader.SettingsActivity; +import de.luhmer.owncloudnewsreader.LazyLoadingLinearLayoutManager; import de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm; import de.luhmer.owncloudnewsreader.database.model.RssItem; import de.luhmer.owncloudnewsreader.databinding.ProgressbarItemBinding; @@ -68,6 +68,8 @@ public class NewsListRecyclerAdapter extends RecyclerView.Adapter rssItems) { //} //new ReloadAdapterAsyncTask().execute(); - totalItemCount = ((Long) dbConn.getCurrentRssItemViewCount()).intValue(); + setTotalItemCount(((Long) dbConn.getCurrentRssItemViewCount()).intValue()); lazyList = rssItems; notifyDataSetChanged(); @@ -492,9 +499,9 @@ protected CurrentRssViewDataHolder doInBackground(Void... params) { @Override protected void onPostExecute(CurrentRssViewDataHolder holder) { lazyList = holder.rssItems; - totalItemCount = holder.maxCount.intValue(); + setTotalItemCount(holder.maxCount.intValue()); cachedPages = 1; notifyDataSetChanged(); } } -} \ No newline at end of file +} From 73b9982df85d90fe40431d4d25e0479c3cc2c833 Mon Sep 17 00:00:00 2001 From: David Luhmer Date: Wed, 16 Oct 2024 14:22:18 +0200 Subject: [PATCH 2/3] refactoring / remove duplicate variable Signed-off-by: David Luhmer --- .../adapter/NewsListRecyclerAdapter.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/adapter/NewsListRecyclerAdapter.java b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/adapter/NewsListRecyclerAdapter.java index f7c6b7845..25f83dd71 100644 --- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/adapter/NewsListRecyclerAdapter.java +++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/adapter/NewsListRecyclerAdapter.java @@ -21,9 +21,9 @@ import java.util.ArrayList; import java.util.List; +import de.luhmer.owncloudnewsreader.LazyLoadingLinearLayoutManager; import de.luhmer.owncloudnewsreader.NewsReaderListActivity; import de.luhmer.owncloudnewsreader.SettingsActivity; -import de.luhmer.owncloudnewsreader.LazyLoadingLinearLayoutManager; import de.luhmer.owncloudnewsreader.database.DatabaseConnectionOrm; import de.luhmer.owncloudnewsreader.database.model.RssItem; import de.luhmer.owncloudnewsreader.databinding.ProgressbarItemBinding; @@ -57,7 +57,6 @@ public class NewsListRecyclerAdapter extends RecyclerView.Adapter 0) { + adapterItemCount <= (lastVisibleItem + visibleThreshold) && + adapterItemCount < adapterTotalItemCount && + adapterItemCount > 0) { loading = true; Log.v(TAG, "start load more task..."); @@ -125,7 +125,10 @@ public void onScrolled(@NonNull RecyclerView recyclerView, } public int getTotalItemCount() { - return totalItemCount; + if (this.layoutManager != null) { + return this.layoutManager.getTotalItemCount(); + } + return 0; } public int getCachedPages() { @@ -133,8 +136,6 @@ public int getCachedPages() { } public void setTotalItemCount(int totalItemCount) { - this.totalItemCount = totalItemCount; - if (this.layoutManager != null) { this.layoutManager.setTotalItemCount(totalItemCount); } @@ -355,7 +356,6 @@ public int getItemViewType(int position) { @Override public int getItemCount() { - //return totalItemCount; return lazyList != null ? lazyList.size() : 0; } From cf6c3c781bdc6cc8deffa1ab93a148dd54ca9afd Mon Sep 17 00:00:00 2001 From: David Luhmer Date: Wed, 16 Oct 2024 14:36:20 +0200 Subject: [PATCH 3/3] formatting Signed-off-by: David Luhmer --- .../LazyLoadingLinearLayoutManager.kt | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/LazyLoadingLinearLayoutManager.kt b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/LazyLoadingLinearLayoutManager.kt index 227d5e3c8..e536020c9 100644 --- a/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/LazyLoadingLinearLayoutManager.kt +++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/LazyLoadingLinearLayoutManager.kt @@ -6,18 +6,17 @@ import androidx.recyclerview.widget.RecyclerView import kotlin.math.roundToInt class LazyLoadingLinearLayoutManager( - context: Context?, - @RecyclerView.Orientation orientation: Int, - reverseLayout: Boolean + context: Context?, + @RecyclerView.Orientation orientation: Int, + reverseLayout: Boolean, ) : LinearLayoutManager(context, orientation, reverseLayout) { + var totalItemCount: Int = 0 - var totalItemCount: Int = 0 + override fun computeVerticalScrollRange(state: RecyclerView.State): Int { + if (state.itemCount == 0) { + return 0 + } - override fun computeVerticalScrollRange(state: RecyclerView.State): Int { - if (state.itemCount == 0) { - return 0 - } - - return (super.computeVerticalScrollRange(state) / state.itemCount.toFloat() * totalItemCount).roundToInt() - } + return (super.computeVerticalScrollRange(state) / state.itemCount.toFloat() * totalItemCount).roundToInt() + } }