1

내 앱은 안드로이드의 Architecture components 라이브러리를 사용하며 무한 스크롤 효과가있는 페이지가 매겨진 REST API에서 가져온 항목의 목록을 표시합니다.안드로이드 페이징 라이브러리를 NetworkBoundResource와 통합하는 방법

NetworkBoundResource과 함께 Paging Library을 사용하면 사용자가 목록을 아래로 스크롤하면 다음 항목이 데이터베이스에서 가져와 표시되고 API가있는 경우 표시됩니다. DB에서 항목을 업데이트하기 위해 동시에 호출됩니다.

나는이 두 패턴의 공동 거주 사례를 찾을 수 없습니다. 나는 또한 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 & 페이징 해방은 서로 관련이없는 결론에 도달했다 :

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

NetworkBoundResource 구현 : 여기에

는 DAO이다 . 그들은 모두 당신이 내 다오

@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를 데이터 소스 를 사용할 필요가 DB를 호출 라이브러리에 대해 Google에 의해 지역에서 https://developer.android.com/topic/libraries/architecture/paging.html

1. 플로우 데이터를로드를 줄 기사에 따라 경찰이 자신의 기능

이 우리가 필요로하는 네트워크에서 데이터를 요청하는 것은 BoundaryCallback 클래스를 LivePagedListBuilder와 함께 구현한다.

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 코드이 콜백의 각 항목이 인덱스/오프셋 포함되어 있다고 가정

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(); 
    } 
} 
0

DB + 네트워크에서 데이터를로드합니다. 일반적으로 그렇지 않습니다. 항목에는 ID 만 포함될 수 있습니다.