Недавно я перешел на библиотеку подкачки вместо пользовательской реализации.Я также использовал Socket.io для выборки данных в режиме реального времени, поэтому, если поступают новые данные, я выполняю поиск ArrayList
моделей, изменяю и затем уведомляю адаптер о внесенных изменениях.
Как я могу сделать то же самое(обновить только указанные модели) с помощью библиотеки подкачки и PositionalDataSource
?
Обновление 1 Я нашел способ доступа и редактирования данных, но как информировать наблюдателей?
Фабрика:
public class GroupsPositionalDataSourceFactory extends DataSource.Factory<Integer, GroupModel> {
private GroupsManager manager;
public MutableLiveData<GroupsPositionalDataSource> postLiveData;
public GroupsPositionalDataSourceFactory(InstrumentManager manager) {
this.manager = manager;
}
@Override
public DataSource<Integer, GroupModel> create() {
GroupsPositionalDataSource dataSource = new GroupsPositionalDataSource(this.manager);
postLiveData = new MutableLiveData<>();
postLiveData.postValue(dataSource);
return dataSource;
}
}
Источник данных:
public class GroupsPositionalDataSource extends PositionalDataSource<GroupModel> {
private static final String TAG = GroupsPositionalDataSource.class.getSimpleName();
private GroupsManager manager;
public GroupsPositionalDataSource(GroupsManager manager) {
this.manager = manager;
}
private int computeCount() {
return manager.getGroupsCount(); // Do HTTP get request
}
private List<GroupModel> loadRangeInternal(int startPosition, int loadCount) {
List<GroupModel> modelList = manager.getGroupsSync(startPosition, loadCount); // Do HTTP get request
return modelList;
}
@Override
public void loadInitial(@NonNull LoadInitialParams params,
@NonNull LoadInitialCallback<GroupModel> callback) {
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<GroupModel> callback) {
callback.onResult(loadRangeInternal(params.startPosition, params.loadSize));
}
}
Инициализация во фрагменте:
private GroupsListAdapter mGroupsListAdapter;
private GroupsPositionalDataSourceFactory factory;
LiveData<PagedList<GroupModel>> groups;
mGroupsListAdapter = new GroupsListAdapter();
mRecycler.setAdapter(mGroupsListAdapter);
PagedList.Config config = new PagedList.Config.Builder()
.setPageSize(10)
.setInitialLoadSizeHint(10)
.build();
factory = new GroupsPositionalDataSourceFactory(groupsManager);
groups = new LivePagedListBuilder(factory, config).build();
groups.observe(this, groupModels -> {
mGroupsListAdapter.submitList(groupModels);
});
При получении обновления обновляются значения:
PagedList<GroupModel> pagedList = groups.getValue();
for (GroupModel model : pagedList.snapshot()) {
if (model != null) {
// Update values
// TODO: Inform the observer
}
}