Android上的PositionalDataSource刷新

问题描述 投票:0回答:1

我正在使用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循环,并检查是否存在任何使无效的回调。这就是我添加无效回调的原因,因为如果没有回调,无效将不执行任何操作。现在我不确定如何在失效回调中更新列表。

android android-architecture-components android-paging
1个回答
0
投票
对于遇到此问题的任何人,我都可以通过VIEW_MODEL类中的这些更改来解决它:

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

© www.soinside.com 2019 - 2024. All rights reserved.