Android LiveData и обновления в реальном времени - PullRequest
0 голосов
/ 16 сентября 2018

Недавно я перешел на библиотеку подкачки вместо пользовательской реализации.Я также использовал 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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...