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
This commit is contained in:
parent
36dc0cd115
commit
5c35ee3415
@ -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 <T>
|
||||||
|
*/
|
||||||
|
public class RoomFactoryWrapper<T> extends DataSource.Factory<Integer, T> {
|
||||||
|
final DataSource.Factory<Integer, T> m_wrappedFactory;
|
||||||
|
|
||||||
|
public RoomFactoryWrapper(@NonNull DataSource.Factory<Integer, T> wrappedFactory) {
|
||||||
|
m_wrappedFactory = wrappedFactory;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NonNull
|
||||||
|
@Override
|
||||||
|
public DataSource<Integer, T> create() {
|
||||||
|
return new DataSourceWrapper<>((PositionalDataSource<T>) m_wrappedFactory.create());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class DataSourceWrapper<T> extends PositionalDataSource<T> {
|
||||||
|
final PositionalDataSource<T> m_wrappedSource;
|
||||||
|
|
||||||
|
DataSourceWrapper(PositionalDataSource<T> 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<T> 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<T> callback) {
|
||||||
|
m_wrappedSource.loadRange(params, callback);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -12,6 +12,7 @@ import androidx.paging.PagedList;
|
|||||||
import com.readrops.app.activities.MainActivity;
|
import com.readrops.app.activities.MainActivity;
|
||||||
import com.readrops.app.database.Database;
|
import com.readrops.app.database.Database;
|
||||||
import com.readrops.app.database.ItemsListQueryBuilder;
|
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.account.Account;
|
||||||
import com.readrops.app.database.entities.Feed;
|
import com.readrops.app.database.entities.Feed;
|
||||||
import com.readrops.app.database.entities.Folder;
|
import com.readrops.app.database.entities.Folder;
|
||||||
@ -68,7 +69,7 @@ public class MainViewModel extends AndroidViewModel {
|
|||||||
if (lastFetch != null)
|
if (lastFetch != null)
|
||||||
itemsWithFeed.removeSource(lastFetch);
|
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()
|
new PagedList.Config.Builder()
|
||||||
.setPageSize(100)
|
.setPageSize(100)
|
||||||
.setPrefetchDistance(150)
|
.setPrefetchDistance(150)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user