我正在使用PagingLibrary,还实现了PositionalDataSource,在这种情况下,我没有使用Room,因为其他开发人员已经声明了我的数据库而且我现在不想迁移到Room。相反,它使用GreenDao作为Sqlite3的包装。
问题是,每当我在数据库中添加/删除/更新项目时,视图都不会更新。即使我要使数据源无效。
DataSourceFactory:
public class ContactDataSourceFactory extends DataSource.Factory<Integer, Contact> {
@NonNull
@Override
public DataSource<Integer, Contact> create() {
return new ContactDataSource();
}
}
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循环,并检查是否存在任何使无效的回调。这就是我添加无效回调的原因,因为如果没有回调,无效将不执行任何操作。现在我不确定如何在失效回调中更新列表。
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,然后使其数据源无效。这将为您创建一个更新的数据源,并将自动更新您的RecyclerView。因此,您可以看到,无需再像问问题时一样先添加
InvalidatedCallBack
。