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..e536020c9 --- /dev/null +++ b/News-Android-App/src/main/java/de/luhmer/owncloudnewsreader/LazyLoadingLinearLayoutManager.kt @@ -0,0 +1,22 @@ +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..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 @@ -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; @@ -22,6 +21,7 @@ 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.database.DatabaseConnectionOrm; @@ -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..."); @@ -122,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() { @@ -130,7 +136,9 @@ public int getCachedPages() { } public void setTotalItemCount(int totalItemCount) { - this.totalItemCount = totalItemCount; + if (this.layoutManager != null) { + this.layoutManager.setTotalItemCount(totalItemCount); + } } public void setCachedPages(int cachedPages) { @@ -348,7 +356,6 @@ public int getItemViewType(int position) { @Override public int getItemCount() { - //return totalItemCount; return lazyList != null ? lazyList.size() : 0; } @@ -384,7 +391,7 @@ public void updateAdapterData(List 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 +}