PositionalDataSource 在 Android 刷新

PositionalDataSource refresh on Android

我正在使用 PagingLibrary 并且还实现了 PositionalDataSource, 在这种情况下我没有使用 Room,因为其他开发人员已经声明了我的数据库 我现在不想迁移到 Room。 相反,它使用 GreenDao 作为 Sqlite3 的包装器。

问题是每当我 adding/removing/updating 数据库中的项目时,视图都不会更新。 即使我打电话是为了使 DataSource 无效。

数据源工厂:

public class ContactDataSourceFactory extends DataSource.Factory<Integer, Contact> {

    @NonNull
    @Override
    public DataSource<Integer, Contact> create() {
        return new ContactDataSource();
    }
}

联系人数据源:

class ContactDataSource extends PositionalDataSource<Contact>{

    @Override
    public void loadInitial(@NonNull LoadInitialParams params, @NonNull LoadInitialCallback<Contact> callback) {
         callback.onResult(contactRepository.getContactsInRange(userId, params.requestedStartPosition, params.requestedLoadSize, false, null), 0);
    }

    @Override
    public void loadRange(@NonNull LoadRangeParams params, @NonNull LoadRangeCallback<Contact> callback) {
         callback.onResult(contactRepository.getContactsInRange(userId, params.startPosition, params.loadSize, false, null));
    }
}

ContactViewModel:

public class ContactViewModel extends ViewModel {

    private final int PAGE_SIZE = 50;

    public final LiveData<PagedList<Contact>> contactList;
    private DataSource contactDataSource;

    public ContactViewModel(){

        PagedList.Config.Builder pageListConfig = new PagedList.Config.Builder();

        pageListConfig
            .setPageSize(PAGE_SIZE)
            .setEnablePlaceholders(false);

        ContactDataSourceFactory contactDataSourceFactory = new ContactDataSourceFactory();
        contactDataSource = contactDataSourceFactory.create();

        contactDataSource.addInvalidatedCallback(new DataSource.InvalidatedCallback() {
            @Override
            public void onInvalidated() {
                // create new DataSource ?
            }
        });
        contactList = new LivePagedListBuilder<>(contactDataSourceFactory, pageListConfig.build()).build();

    }

    public void invalidateDataSource(){
        contactDataSource.invalidate();
    }
}

我正在从我的片段中呼叫 invalidateDataSource()。 一开始我调用这个方法的时候,看到PagingLibrary内部实现是经过一个for循环,检查是否有失效回调。 这就是我添加失效回调的原因,因为如果我没有它,无效回调什么也不做。现在我不确定如何更新失效回调中的列表。

对于遇到此问题的任何人,我能够通过我的 VIEW_MODEL class:

中的这些更改来解决它
public class ContactViewModel extends ViewModel {

    private final int PAGE_SIZE = 50;

    public final LiveData<PagedList<Contact>> contactList;
    public MutableLiveData<String> filterConstraint = new MutableLiveData<>();

    public ContactViewModel(){

        PagedList.Config.Builder pageListConfig = new PagedList.Config.Builder();

        pageListConfig
            .setPageSize(PAGE_SIZE)
            .setEnablePlaceholders(false);

        contactList = Transformations.switchMap(filterConstraint, input -> {
            boolean filtered = !(TextUtils.isEmpty(input) || input.equals("%%"));
            ContactDataSourceFactory contactDataSourceFactory = new ContactDataSourceFactory(filtered, filtered ? input : null);
            return new LivePagedListBuilder<>(contactDataSourceFactory, pageListConfig.build()).build();
        });
    }

    public void invalidateDataSource(){
        PagedList<Contact> pagedList = contactList.getValue();
        if (pagedList != null && pagedList.getDataSource() != null)
            pagedList.getDataSource().invalidate();
    }
}

刷新需要从LiveData中获取pageList,然后使其DataSource失效

这将为您更新数据源,并自动更新您的 RecyclerView。 如您所见,无需像我在提问时首先添加的那样添加 InvalidatedCallBack