Why?
Log D/DATA: load initial 0 30 30
after invalidate(). Why load start from 8 position after invalidate?
D/DATA: load initial 8 30 30
D/SAME: 0 equal 8 false
    29 equal 37 false
    0 equal 9 false
    1 equal 8 false
    28 equal 37 false
    29 equal 36 false
D/SAME: 0 equal 10 false
....
                RoomSourceFactory sourceFactory = new RoomSourceFactory(context);
        PagedList.Config config = new PagedList.Config.Builder()
                .setEnablePlaceholders(false)
                .setPageSize(10)
                .build();
        LiveData<PagedList<RoomItem>> pagedListLiveData = new LivePagedListBuilder<>(sourceFactory, config)
                .setFetchExecutor(Executors.newSingleThreadExecutor())
                .build();
        roomListPagedAdapter = new RoomListPagedAdapter(
                new DiffUtil.ItemCallback<RoomItem>() {
                    @Override
                    public boolean areItemsTheSame(@NonNull RoomItem oldRoomItem, @NonNull RoomItem newRoomItem) {
                        Log.d("SAME", oldRoomItem.name + " equal " + newRoomItem.name + " " + oldRoomItem.name.equals(newRoomItem.name));
                        return oldRoomItem.name.equals(newRoomItem.name);
                    }
                    @Override
                    public boolean areContentsTheSame(@NonNull RoomItem oldRoomItem, @NonNull RoomItem newRoomItem) {
                        Log.d("CONTENT", oldRoomItem.name + " equal " + newRoomItem.name + " " + oldRoomItem.name.equals(newRoomItem.name));
                        return oldRoomItem.name.equals(newRoomItem.name);
                    }
                },
                onClickListener);
        pagedListLiveData.observe(this, new Observer<PagedList<RoomItem>>() {
            @Override
            public void onChanged(@Nullable PagedList<RoomItem> roomItemPagedList) {
                roomListPagedAdapter.submitList(roomItemPagedList);
            }
        });
        RecyclerView recyclerView = rootView.findViewById(R.id.community_recycler_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        recyclerView.setAdapter(roomListPagedAdapter);
public class RoomPositionalDataSource extends PositionalDataSource<RoomItem> {
private Context context;
private Database database;
public RoomPositionalDataSource(Context context) {
    database = new Database(context);
    new Timer().schedule(new TimerTask() {
        @Override
        public void run() {
            invalidate();
        }
    }, 10000);
}
@Override
public void loadInitial(@NonNull LoadInitialParams params, @NonNull LoadInitialCallback<RoomItem> callback) {
    int start = params.requestedStartPosition;
    int size = params.requestedLoadSize;
    List<RoomItem> result = new ArrayList<>();
    for (int i=start; i < start + size; i++) {
        RoomItem roomItem = new RoomItem();
        roomItem.id = String.valueOf(i);
        roomItem.name = String.valueOf(i);
        result.add(roomItem);
    }
    callback.onResult(result, params.requestedStartPosition);
    Log.d("DATA", "load initial " + params.requestedStartPosition + " " + params.requestedLoadSize + " " + result.size());
}
@Override
public void loadRange(@NonNull LoadRangeParams params, @NonNull LoadRangeCallback<RoomItem> callback) {
    List<RoomItem> result = new ArrayList<>();
    for (int i=params.startPosition; i < params.startPosition + params.loadSize; i++) {
        RoomItem roomItem = new RoomItem();
        roomItem.id = String.valueOf(i);
        roomItem.name = String.valueOf(i);
        result.add(roomItem);
    }
    callback.onResult(result);
    Log.d("DATA", "load range " + params.startPosition + " " + params.loadSize + " " + result.size());
}
}
Image
For anyone coming to this question from search — there is a bug in paging library, more info can be found at Google issue tracker: https://issuetracker.google.com/issues/123834703
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With