1

私のアプリはAndroidのArchitecture componentsライブラリを使用しており、無限のスクロールエフェクトを使用してページ分割されたREST APIからフェッチされたアイテムのリストを表示しています。AndroidPaging LibraryとNetworkBoundResourceを統合する方法

私がしようとしているのは、NetworkBoundResourceと組み合わせてPaging Libraryを使用することです。ユーザーがリストをスクロールすると、データベースから次のアイテムがフェッチされ、存在し、APIが表示されます。同時にDB内の項目を更新するために呼び出されます。

私はこれらの2つのパターンが共生している例は見つかりませんでした。ここで

はDAOである:ここでは

@Query("SELECT * FROM items ORDER BY id DESC") 
LivePagedListProvider<Integer,MyItem> loadListPaginated(); 

は私NetworkBoundResource実装です:

public class PagedListNetworkBoundResource extends NetworkBoundResource<PagedList<MyItem>, List<MyItem>> { 

    @Override 
    protected void saveCallResult(@NonNull List<MyItem> items) { 
     // Inserting new items into DB 
     dao.insertAll(items); 
    } 

    @Override 
    protected boolean shouldFetch(@Nullable PagedList<MyItem> data) { 
     return true; 
    } 

    @NonNull 
    @Override 
    protected LiveData<PagedList<MyItem>> loadFromDb() { 
     return Transformations.switchMap(dao.loadListPaginated().create(INITIAL_LOAD_KEY, PAGE_SIZE), 
       new Function<PagedList<MyItem>, LiveData<List<MyItem>>>() { 

      @Override 
      public LiveData<PagedList<MyItem>> apply(final PagedList<MyItem> input) { 
       // Here I must load nested objects, attach them, 
       // and return the fully loaded items 
      } 
     }); 
    } 

    @NonNull 
    @Override 
    protected LiveData<ApiResponse<List<MyItem>>> createCall() { 
     // I don't get the current paged list offset to perform a call to the API 
     return ...; 
    } 
} 

答えて

0

私もNetworkBoundResourceについて多くのことを検索し、私はNetworkBoundResource &ページングのLibは、その相互に関連していないという結論に達しました。彼らは両方の記事を1としてそこに独自の機能

を持っているあなたは私のダオ

@Dao 
public interface UserDao { 
    @Insert(onConflict = OnConflictStrategy.REPLACE) 
    void insert(User... user); 
    @Insert(onConflict = OnConflictStrategy.REPLACE) 
    void insert(List<User> users); 

    @Query("Select * from User ") 
    public abstract DataSource.Factory<Integer,User> getList(); 
} 

2.thenデータソース を使用する必要があるGoogleがローカルDBから1.for

https://developer.android.com/topic/libraries/architecture/paging.html ページングライブラリについてのデータのロードを与えますネットワークからのデータ要求LivePagedListBuilderでBoundaryCallbackクラスを実装する必要があります

public class UserBoundaryCallback extends PagedList.BoundaryCallback<User> { 
    public static final String TAG = "ItemKeyedUserDataSource"; 
    GitHubService gitHubService; 
    AppExecutors executors; 
    private MutableLiveData networkState; 
    private MutableLiveData initialLoading; 
    public UserBoundaryCallback(AppExecutors executors) { 
     super(); 
     gitHubService = GitHubApi.createGitHubService(); 
     this.executors = executors; 
     networkState = new MutableLiveData(); 
     initialLoading = new MutableLiveData(); 
    } 
    public MutableLiveData getNetworkState() { 
     return networkState; 
    } 

    public MutableLiveData getInitialLoading() { 
     return initialLoading; 
    } 

    @Override 
    public void onZeroItemsLoaded() { 
     //super.onZeroItemsLoaded(); 
     fetchFromNetwork(null); 
    } 

    @Override 
    public void onItemAtFrontLoaded(@NonNull User itemAtFront) { 
     //super.onItemAtFrontLoaded(itemAtFront); 
    } 

    @Override 
    public void onItemAtEndLoaded(@NonNull User itemAtEnd) { 
     // super.onItemAtEndLoaded(itemAtEnd); 
     fetchFromNetwork(itemAtEnd); 
    } 
    public void fetchFromNetwork(User user) { 
     if(user==null) { 
      user = new User(); 
      user.userId = 1; 
     } 
     networkState.postValue(NetworkState.LOADING); 
     gitHubService.getUser(user.userId,20).enqueue(new Callback<List<User>>() { 
      @Override 
      public void onResponse(Call<List<User>> call, Response<List<User>> response) { 
       executors.diskIO().execute(()->{ 
        if(response.body()!=null) 
         userDao.insert(response.body()); 
         networkState.postValue(NetworkState.LOADED); 
       }); 
      } 

      @Override 
      public void onFailure(Call<List<User>> call, Throwable t) { 
       String errorMessage; 
       errorMessage = t.getMessage(); 
       if (t == null) { 
        errorMessage = "unknown error"; 
       } 
       Log.d(TAG,errorMessage); 
       networkState.postValue(new NetworkState(Status.FAILED, errorMessage)); 
      } 
     }); 
    } 

} 

3.My VMコードこれは、コールバックの各アイテムが持つインデックス/オフセットが含まれていることを前提とし

0
public class UserViewModel extends ViewModel { 

    public LiveData<PagedList<User>> userList; 
    public LiveData<NetworkState> networkState; 
    AppExecutors executor; 
    UserBoundaryCallback userBoundaryCallback; 

    public UserViewModel() { 
     executor = new AppExecutors(); 
    } 
    public void init(UserDao userDao) 
    { 
     PagedList.Config pagedListConfig = 
       (new PagedList.Config.Builder()).setEnablePlaceholders(true) 
         .setPrefetchDistance(10) 
         .setPageSize(20).build(); 
     userBoundaryCallback = new UserBoundaryCallback(executor); 
     networkState = userBoundaryCallback.getNetworkState(); 
     userList = (new LivePagedListBuilder(userDao.getList(), pagedListConfig).setBoundaryCallback(userBoundaryCallback)) 
       .build(); 
    } 
} 

DB +ネットワークからデータをロードします。通常、そうではありません。アイテムにはIDのみが含まれている場合があります。

関連する問題