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
。
我正在使用 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
。