Feroz Khan
Feroz Khan

Reputation: 2846

loadInitial method not getting called in PositionalDataSource<Item>

I'm implementing PositionalDataSource from Paging Library in Java and getting an issue that constructor of PositionalDataSource's child class is getting called but after that loadInitial method is not getting called.

public HistoryPositionalDataSource(List<CallTable> callLogs)
{
    this.callLogs = callLogs;
    Log.d("PaginationDataSource", "Constructor");
}

@Override
public void loadInitial(@NonNull LoadInitialParams params, @NonNull LoadInitialCallback callback) {
    Log.d("PaginationDataSource", "loadInitial");
    if (callLogs!=null && !callLogs.isEmpty())
    {
        int totalCount = computeCount();
        int position = computeInitialLoadPosition(params, totalCount);
        int loadSize = computeInitialLoadSize(params, position, totalCount);
        callback.onResult(loadRangeInternal(position, loadSize), position, totalCount);
    }
}

@Override
public void loadRange(@NonNull LoadRangeParams params, @NonNull LoadRangeCallback callback) {
    callback.onResult(loadRangeInternal(params.startPosition, params.loadSize));
}

Here's my PageListConfig

private void init() {
    pagedListConfig = (new PagedList.Config.Builder()).setEnablePlaceholders(true)
            .setInitialLoadSizeHint(Integer.MAX_VALUE).setPageSize(Integer.MAX_VALUE).build();
    Executor executor = Executors.newFixedThreadPool(3);
    List<CallTable> listLogs = getCallLogs(context);
    historyDataSourceFactory = new HistoryDataSourceFactory(listLogs);
    LivePagedListBuilder livePagedListBuilder = new LivePagedListBuilder(historyDataSourceFactory, pagedListConfig);
    pagedCallLogs =  livePagedListBuilder
            .setFetchExecutor(executor)
            .build();
}

Factory class:

public class HistoryDataSourceFactory extends DataSource.Factory {

private static final String TAG = HistoryDataSourceFactory.class.getSimpleName();
private HistoryPositionalDataSource historyPositionalDataSource;

public HistoryDataSourceFactory(List<CallTable> callLogs)
{
    if (callLogs!=null && !callLogs.isEmpty())
    {
        Log.d("PaginationFactory", "NotNullLogs");
        historyPositionalDataSource = new HistoryPositionalDataSource(callLogs);
    }
}

@Override
public DataSource create() {
    return historyPositionalDataSource;
}
}

My getPagedCallLogs method:

public synchronized LiveData<PagedList<CallTable>> getPagedCallLogs() {

    if (pagedCallLogs!=null && pagedCallLogs.getValue()!=null)
    {
        Log.d("PagingGetData", "Done");
        return pagedCallLogs;
    }
    else
    {
        Log.d("PagingGetData", "Null");
        return null;
    }
}

Logs image is given below. Logs

Upvotes: 3

Views: 2001

Answers (2)

Feroz Khan
Feroz Khan

Reputation: 2846

After too many struggle, I become able to resolve my issue. The issue was with my getPagedCallLog method. I wrote:

public synchronized LiveData<PagedList<CallTable>> getPagedCallLogs() {

if (pagedCallLogs!=null && pagedCallLogs.getValue()!=null)
{
    Log.d("PagingGetData", "Done");
    return pagedCallLogs;
}
else
{
    Log.d("PagingGetData", "Null");
    return null;
}
}

I was taking Google I/O '18, in which he said that loadInitial is called by the pageList, then I realise that it wasn't getting called in my case. And it is working fine after removing pagedCallLogs.getValue()!=null which was my stupid mistake.

Now it looks like this:

public synchronized LiveData<PagedList<CallTable>> getPagedCallLogs() {
if (pagedCallLogs!=null)
{
    Log.d("PagingGetData", "Done");
    return pagedCallLogs;
}
else
{
    Log.d("PagingGetData", "Null");
    return null;
}
}

Upvotes: 0

Vygintas B
Vygintas B

Reputation: 1694

Load size and offset is set via PagedList.Config so you don't need to calculate load range yourself.

Change your loadInitial function

@Override
public void loadInitial(@NonNull LoadInitialParams params, @NonNull LoadInitialCallback callback) {
    Log.d("PaginationDataSource", "loadInitial");
    if (callLogs!=null && !callLogs.isEmpty())
    {
        callback.onResult(loadRangeInternal(0, params.requestedLoadSize), 0);
    }
}

Edit: Try this config aswell

 PagedList.Config config =
            new PagedList.Config.Builder()
                    .setPageSize(50)
                    .setEnablePlaceholders(false)
                    .setPrefetchDistance(25)
                    .build();

Edit2: Try changing extention from DataSource.Factory to DataSource.Factory<Integer, ModelClass> and PositionalDataSource to PositionalDataSource<ModelClass>

Upvotes: 3

Related Questions