From 5c35ee3415e4246eea760435ee3d3039a5781d1a Mon Sep 17 00:00:00 2001 From: Shinokuni Date: Sat, 19 Oct 2019 19:13:34 +0200 Subject: [PATCH] Fix item list scrolling down when updating data with a temporary workaround to keep until a new version of androidx paging is released with the right fix --- .../app/database/RoomFactoryWrapper.java | 76 +++++++++++++++++++ .../app/viewmodels/MainViewModel.java | 3 +- 2 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/readrops/app/database/RoomFactoryWrapper.java diff --git a/app/src/main/java/com/readrops/app/database/RoomFactoryWrapper.java b/app/src/main/java/com/readrops/app/database/RoomFactoryWrapper.java new file mode 100644 index 00000000..4e1175db --- /dev/null +++ b/app/src/main/java/com/readrops/app/database/RoomFactoryWrapper.java @@ -0,0 +1,76 @@ +package com.readrops.app.database; + +import androidx.annotation.NonNull; +import androidx.paging.DataSource; +import androidx.paging.PositionalDataSource; + +/** + * Workaround class to avoid item recycler view scrolling down when updating data + * This class is to keep until a new version of androidx paging is released with + * bug https://issuetracker.google.com/issues/123834703 merged. + * @param + */ +public class RoomFactoryWrapper extends DataSource.Factory { + final DataSource.Factory m_wrappedFactory; + + public RoomFactoryWrapper(@NonNull DataSource.Factory wrappedFactory) { + m_wrappedFactory = wrappedFactory; + } + + @NonNull + @Override + public DataSource create() { + return new DataSourceWrapper<>((PositionalDataSource) m_wrappedFactory.create()); + } + + public static class DataSourceWrapper extends PositionalDataSource { + final PositionalDataSource m_wrappedSource; + + DataSourceWrapper(PositionalDataSource wrappedSource) { + m_wrappedSource = wrappedSource; + } + + @Override + public void addInvalidatedCallback(@NonNull InvalidatedCallback onInvalidatedCallback) { + m_wrappedSource.addInvalidatedCallback(onInvalidatedCallback); + } + + @Override + public void removeInvalidatedCallback( + @NonNull InvalidatedCallback onInvalidatedCallback) { + m_wrappedSource.removeInvalidatedCallback(onInvalidatedCallback); + } + + @Override + public void invalidate() { + m_wrappedSource.invalidate(); + } + + @Override + public boolean isInvalid() { + return m_wrappedSource.isInvalid(); + } + + @Override + public void loadInitial(@NonNull LoadInitialParams params, + @NonNull LoadInitialCallback callback) { + // Workaround for paging bug: https://issuetracker.google.com/issues/123834703 + // edit initial load position to start 1/2 load ahead of requested position + int newStartPos = params.placeholdersEnabled + ? params.requestedStartPosition + : Math.max(0, params.requestedStartPosition - (params.requestedLoadSize / 2)); + m_wrappedSource.loadInitial(new LoadInitialParams( + newStartPos, + params.requestedLoadSize, + params.pageSize, + params.placeholdersEnabled + ), callback); + } + + @Override + public void loadRange(@NonNull LoadRangeParams params, + @NonNull LoadRangeCallback callback) { + m_wrappedSource.loadRange(params, callback); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/readrops/app/viewmodels/MainViewModel.java b/app/src/main/java/com/readrops/app/viewmodels/MainViewModel.java index e809040e..3daf2e4c 100644 --- a/app/src/main/java/com/readrops/app/viewmodels/MainViewModel.java +++ b/app/src/main/java/com/readrops/app/viewmodels/MainViewModel.java @@ -12,6 +12,7 @@ import androidx.paging.PagedList; import com.readrops.app.activities.MainActivity; import com.readrops.app.database.Database; import com.readrops.app.database.ItemsListQueryBuilder; +import com.readrops.app.database.RoomFactoryWrapper; import com.readrops.app.database.entities.account.Account; import com.readrops.app.database.entities.Feed; import com.readrops.app.database.entities.Folder; @@ -68,7 +69,7 @@ public class MainViewModel extends AndroidViewModel { if (lastFetch != null) itemsWithFeed.removeSource(lastFetch); - lastFetch = new LivePagedListBuilder<>(db.itemDao().selectAll(queryBuilder.getQuery()), + lastFetch = new LivePagedListBuilder<>(new RoomFactoryWrapper<>(db.itemDao().selectAll(queryBuilder.getQuery())), new PagedList.Config.Builder() .setPageSize(100) .setPrefetchDistance(150)