Я использую библиотеку подкачки Android для отображения списка данных во фрагменте. Это работает, но когда я поворачиваю экран, список загружается заново вместо уже загруженных данных.
Я сделал это для этой статьи. В чем проблема?
Это мой RxPagingSource
public Single loadSingle(@NotNull LoadParams loadParams) {
Integer nextPageNumber = loadParams.getKey();
if (nextPageNumber == null) {
nextPageNumber = 1;
}
return dataApi.getBooksCatalog(nextPageNumber, new ArrayMap(), preferencesHelper.auth())
.subscribeOn(Schedulers.io())
.map(this::toLoadResult)
.onErrorReturn(LoadResult.Error::new);
}
private LoadResult toLoadResult(ResponseData response) {
int currentPage = response.getData().getCurrentPage();
return new LoadResult.Page(
response.getData().getData(),
currentPage > 1 ? currentPage - 1 : null,
response.getData().getData().isEmpty() ? null : currentPage + 1);
}
public Integer getRefreshKey(@NotNull PagingState pagingState) {
Integer anchorPosition = pagingState.getAnchorPosition();
if (anchorPosition == null) {
return null;
}
LoadResult.Page anchorPage = pagingState.closestPageToPosition(anchorPosition);
if (anchorPage == null) {
return null;
}
Integer prevKey = anchorPage.getPrevKey();
if (prevKey != null) {
return prevKey + 1;
}
Integer nextKey = anchorPage.getNextKey();
if (nextKey != null) {
return nextKey - 1;
}
return null;
}
Я не понял, в каком случае следует вызывать метод getRefreshKey().
PagingDataAdapter и DiffUtil.ItemCallback являются стандартными ...
В моей ViewModel
@HiltViewModel
public class BooksViewModel extends BaseDisposablesViewModel {
PagingConfig pagingConfig = new PagingConfig(50, 25, true, 100, 200);
private final DataApiInterface dataApi;
private final SharedPreferencesHelper preferencesHelper;
Flowable
> flowable;
@Inject
BooksViewModel(DataApiInterface dataApi, SharedPreferencesHelper preferencesHelper) {
this.dataApi = dataApi;
this.preferencesHelper = preferencesHelper;
init();
}
private void init() {
CoroutineScope viewModelScope = ViewModelKt.getViewModelScope(this);
Pager pager = new Pager(
pagingConfig,
() -> new BooksPagingSource(dataApi, preferencesHelper)
);
flowable = PagingRx.getFlowable(pager);
PagingRx.cachedIn(flowable, viewModelScope);
}
}
И мой фрагмент...
@AndroidEntryPoint
public class BooksFragment extends BaseFragment {
private FragmentBooksBinding binding;
private final CompositeDisposable disposable = new CompositeDisposable();
private BooksPagingAdapter pagingAdapter;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
BooksViewModel viewModel = new ViewModelProvider(requireActivity()).get(BooksViewModel.class);
pagingAdapter = new BooksPagingAdapter(new BooksPagingAdapter.BookComparator());
disposable.add(viewModel.flowable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(bookPagingData -> pagingAdapter.submitData(getLifecycle(), bookPagingData)));
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
binding = FragmentBooksBinding.inflate(inflater, container, false);
return binding.getRoot();
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
binding.list.setAdapter(pagingAdapter);
}
@Override
public void onDestroy() {
super.onDestroy();
disposable.clear();
}
}
Подробнее здесь: https://stackoverflow.com/questions/699 ... ate-screen