Refactor getPageData

This commit is contained in:
FooIbar authored and tarsin committed 2022-12-21 18:28:52 +08:00
1 parent 416ef8d6d7
commit b287af4824
10 files changed
+166 -303

No files matched your search

@@ -192,6 +192,8 @@ public class ContentLayout extends FrameLayout {
private static final String KEY_START_PAGE = "start_page";
private static final String KEY_END_PAGE = "end_page";
private static final String KEY_PAGES = "pages";
private static final String KEY_PREV = "prev";
private static final String KEY_NEXT = "next";
/**
* Generate task id
*/
@@ -227,17 +229,23 @@ public class ContentLayout extends FrameLayout {
*/
private int mPages;
private int mNextPage;
private String mPrev;
private String mNext;
private int mCurrentTaskId;
private int mCurrentTaskType;
private int mCurrentTaskPage;
private final SwipeRefreshLayout.OnRefreshListener mOnRefreshListener = new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
if (mStartPage > 0) {
if (mPrev != null) {
mCurrentTaskId = mIdGenerator.nextId();
mCurrentTaskType = TYPE_PRE_PAGE_KEEP_POS;
getPageData(mCurrentTaskId, mCurrentTaskType, mCurrentTaskPage, mPrev, false);
} else if (mStartPage > 0) {
mCurrentTaskId = mIdGenerator.nextId();
mCurrentTaskType = TYPE_PRE_PAGE_KEEP_POS;
mCurrentTaskPage = mStartPage - 1;
getPageData(mCurrentTaskId, mCurrentTaskType, mCurrentTaskPage);
getPageData(mCurrentTaskId, mCurrentTaskType, mCurrentTaskPage, null, true);
} else {
doRefresh();
}
@@ -248,28 +256,32 @@ public class ContentLayout extends FrameLayout {
private final RecyclerView.OnScrollListener mOnScrollListener = new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
if (!mRefreshLayout.isRefreshing() && !recyclerView.canScrollVertically(1) && mEndPage < mPages) {
if (!mRefreshLayout.isRefreshing() && !recyclerView.canScrollVertically(1)) {
// Get next page
mBottomProgress.show();
if (mEndPage < mPages) {
if (mNext != null) {
mCurrentTaskId = mIdGenerator.nextId();
mCurrentTaskType = TYPE_NEXT_PAGE_KEEP_POS;
getPageData(mCurrentTaskId, mCurrentTaskType, mCurrentTaskPage, mNext, true);
} else if (mEndPage < mPages) {
// Get next page
// Fill pages before NextPage with empty list
while (mNextPage > mEndPage && mEndPage < mPages) {
mCurrentTaskId = mIdGenerator.nextId();
mCurrentTaskType = TYPE_NEXT_PAGE_KEEP_POS;
mCurrentTaskPage = mEndPage;
onGetPageData(mCurrentTaskId, mPages, mNextPage, Collections.emptyList());
onGetPageData(mCurrentTaskId, mPages, mNextPage, null, null, Collections.emptyList());
}
mCurrentTaskId = mIdGenerator.nextId();
mCurrentTaskType = TYPE_NEXT_PAGE_KEEP_POS;
mCurrentTaskPage = mEndPage;
getPageData(mCurrentTaskId, mCurrentTaskType, mCurrentTaskPage);
getPageData(mCurrentTaskId, mCurrentTaskType, mCurrentTaskPage, null, true);
} else if (mEndPage == mPages) {
// Refresh last page
mCurrentTaskId = mIdGenerator.nextId();
mCurrentTaskType = TYPE_REFRESH_PAGE;
mCurrentTaskPage = mEndPage - 1;
getPageData(mCurrentTaskId, mCurrentTaskType, mCurrentTaskPage);
getPageData(mCurrentTaskId, mCurrentTaskType, mCurrentTaskPage, null, true);
} else {
Log.e(TAG, "Try to footer refresh, but mEndPage = " + mEndPage + ", mPages = " + mPages);
mBottomProgress.hide();
@@ -304,12 +316,14 @@ public class ContentLayout extends FrameLayout {
}
/**
* Call {@link #onGetPageData(int, int, int, List)} when get data
* Call {@link #onGetPageData(int, int, int, String, String, List)} when get data
*
* @param taskId task id
* @param page the page to get
* @param index the index to get
* @param isNext the index is next or prev
*/
protected abstract void getPageData(int taskId, int type, int page);
protected abstract void getPageData(int taskId, int type, int page, String index, boolean isNext);
protected abstract Context getContext();
@@ -398,7 +412,7 @@ public class ContentLayout extends FrameLayout {
protected void onClearData() {
}
public void onGetPageData(int taskId, int pages, int nextPage, List<E> data) {
public void onGetPageData(int taskId, int pages, int nextPage, String prev, String next, List<E> data) {
if (mCurrentTaskId == taskId) {
int dataSize;
@@ -408,6 +422,8 @@ public class ContentLayout extends FrameLayout {
mEndPage = 1;
mPages = pages;
mNextPage = nextPage;
mPrev = prev;
mNext = next;
mPageDivider.clear();
mPageDivider.add(data.size());
if (data.isEmpty()) {
@@ -449,6 +465,7 @@ public class ContentLayout extends FrameLayout {
mPageDivider.add(0, dataSize);
mStartPage--;
mPages = Math.max(mEndPage, pages);
mPrev = prev;
// assert mStartPage >= 0
if (data.isEmpty()) {
@@ -504,6 +521,7 @@ public class ContentLayout extends FrameLayout {
mEndPage++;
mNextPage = nextPage;
mPages = Math.max(mEndPage, pages);
mNext = next;
if (data.isEmpty()) {
// OK, that's all
if (mData.isEmpty()) {
@@ -551,6 +569,8 @@ public class ContentLayout extends FrameLayout {
mEndPage = mCurrentTaskPage + 1;
mNextPage = nextPage;
mPages = pages;
mPrev = prev;
mNext = next;
mPageDivider.clear();
mPageDivider.add(data.size());
if (data.isEmpty()) {
@@ -684,7 +704,7 @@ public class ContentLayout extends FrameLayout {
mCurrentTaskId = mIdGenerator.nextId();
mCurrentTaskType = TYPE_REFRESH;
mCurrentTaskPage = 0;
getPageData(mCurrentTaskId, mCurrentTaskType, mCurrentTaskPage);
getPageData(mCurrentTaskId, mCurrentTaskType, mCurrentTaskPage, null, true);
}
/**
@@ -763,7 +783,7 @@ public class ContentLayout extends FrameLayout {
mCurrentTaskId = mIdGenerator.nextId();
mCurrentTaskType = TYPE_PRE_PAGE;
mCurrentTaskPage = page;
getPageData(mCurrentTaskId, mCurrentTaskType, mCurrentTaskPage);
getPageData(mCurrentTaskId, mCurrentTaskType, mCurrentTaskPage, null, true);
} else if (page == mEndPage) {
mRefreshLayout.setRefreshing(false);
mBottomProgress.hide();
@@ -771,7 +791,7 @@ public class ContentLayout extends FrameLayout {
mCurrentTaskId = mIdGenerator.nextId();
mCurrentTaskType = TYPE_NEXT_PAGE;
mCurrentTaskPage = page;
getPageData(mCurrentTaskId, mCurrentTaskType, mCurrentTaskPage);
getPageData(mCurrentTaskId, mCurrentTaskType, mCurrentTaskPage, null, true);
} else {
mRefreshLayout.setRefreshing(false);
mBottomProgress.hide();
@@ -779,17 +799,17 @@ public class ContentLayout extends FrameLayout {
mCurrentTaskId = mIdGenerator.nextId();
mCurrentTaskType = TYPE_SOMEWHERE;
mCurrentTaskPage = page;
getPageData(mCurrentTaskId, mCurrentTaskType, mCurrentTaskPage);
getPageData(mCurrentTaskId, mCurrentTaskType, mCurrentTaskPage, null, true);
}
}
protected void doGoToPage(int page) {
public void goTo(String index, boolean isNext) {
mRefreshLayout.setRefreshing(false);
mBottomProgress.hide();
mCurrentTaskId = mIdGenerator.nextId();
mCurrentTaskType = TYPE_SOMEWHERE;
mCurrentTaskPage = page;
getPageData(mCurrentTaskId, mCurrentTaskType, mCurrentTaskPage);
mCurrentTaskPage = 0;
getPageData(mCurrentTaskId, mCurrentTaskType, mCurrentTaskPage, index, isNext);
}
protected Parcelable saveInstanceState(Parcelable superState) {
@@ -813,6 +833,8 @@ public class ContentLayout extends FrameLayout {
bundle.putInt(KEY_START_PAGE, mStartPage);
bundle.putInt(KEY_END_PAGE, mEndPage);
bundle.putInt(KEY_PAGES, mPages);
bundle.putString(KEY_PREV, mPrev);
bundle.putString(KEY_NEXT, mNext);
return bundle;
}
@@ -837,6 +859,8 @@ public class ContentLayout extends FrameLayout {
mStartPage = bundle.getInt(KEY_START_PAGE);
mEndPage = bundle.getInt(KEY_END_PAGE);
mPages = bundle.getInt(KEY_PAGES);
mPrev = bundle.getString(KEY_PREV);
mNext = bundle.getString(KEY_NEXT);
notifyDataSetChanged();
@@ -845,6 +869,8 @@ public class ContentLayout extends FrameLayout {
mStartPage = 0;
mEndPage = 0;
mPages = 0;
mPrev = null;
mNext = null;
firstRefresh();
}