2

最近我迁移到分页库而不是自定义实现。我还使用 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
    }
}
4

0 回答 0