Load next set of changes on scroll to bottom of change list
When the user scrolls to the bottom of the change list, the next set
of changes is automatically loaded and added to the change list.
Change-Id: I057ddc39590b24dbc2fed394a0b0c4ce32e46801
Signed-off-by: Edwin Kempin <ekempin@google.com>
diff --git a/app/src/main/java/com/google/reviewit/ReviewChangesFragment.java b/app/src/main/java/com/google/reviewit/ReviewChangesFragment.java
index 4c93b7c..e667928 100644
--- a/app/src/main/java/com/google/reviewit/ReviewChangesFragment.java
+++ b/app/src/main/java/com/google/reviewit/ReviewChangesFragment.java
@@ -24,6 +24,8 @@
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
+import android.view.ViewTreeObserver;
+import android.widget.ScrollView;
import android.widget.TextView;
import com.google.gerrit.extensions.restapi.RestApiException;
@@ -66,7 +68,24 @@
}
});
- // TODO detect when scrolled to the end and automatically load next page
+ final View nextPageProgress = v(R.id.nextPageProgress);
+ final ScrollView scrollView = (ScrollView) v(R.id.scrollView);
+ scrollView.getViewTreeObserver().addOnScrollChangedListener(
+ new ViewTreeObserver.OnScrollChangedListener() {
+ @Override
+ public void onScrollChanged() {
+ if (getApp().getQueryHandler().hasNext()
+ && nextPageProgress.getVisibility() == View.GONE) {
+ View lastChild =
+ scrollView.getChildAt(scrollView.getChildCount() - 1);
+ if ((lastChild.getBottom()
+ - (scrollView.getHeight() + scrollView.getScrollY())) == 0) {
+ setVisible(nextPageProgress);
+ display();
+ }
+ }
+ }
+ });
}
private void display() {
@@ -83,6 +102,7 @@
new AsyncTask<Void, Void, ChangeListData>() {
private View progress;
private View initialProgress;
+ private View nextPageProgress;
private View reloadButton;
private TextView statusText;
private ViewGroup changeList;
@@ -92,6 +112,7 @@
super.onPreExecute();
progress = v(R.id.progress);
initialProgress = v(R.id.initialProgress);
+ nextPageProgress = v(R.id.nextPageProgress);
reloadButton = v(R.id.reloadButton);
statusText = tv(R.id.statusText);
changeList = vg(R.id.changeList);
@@ -129,7 +150,7 @@
getActivity().invalidateOptionsMenu();
setInvisible(progress);
- setGone(initialProgress, reloadButton);
+ setGone(initialProgress, reloadButton, nextPageProgress);
if (changeListData.error != null) {
statusText.setText(changeListData.error);
diff --git a/app/src/main/java/com/google/reviewit/app/QueryHandler.java b/app/src/main/java/com/google/reviewit/app/QueryHandler.java
index bdaa6f3..0a87518 100644
--- a/app/src/main/java/com/google/reviewit/app/QueryHandler.java
+++ b/app/src/main/java/com/google/reviewit/app/QueryHandler.java
@@ -64,7 +64,10 @@
public List<Change> next() throws RestApiException {
query();
- return result.subList(page * LIMIT_QUERY, (page + 1) * LIMIT_QUERY);
+ List<Change> nextChanges =
+ result.subList(page * LIMIT_QUERY, (page + 1) * LIMIT_QUERY);
+ page++;
+ return nextChanges;
}
public boolean hasNext() {
diff --git a/app/src/main/res/layout/content_review_changes.xml b/app/src/main/res/layout/content_review_changes.xml
index 3851a97..35e87b5 100644
--- a/app/src/main/res/layout/content_review_changes.xml
+++ b/app/src/main/res/layout/content_review_changes.xml
@@ -22,11 +22,11 @@
<include layout="@layout/progress"/>
<ScrollView
+ android:id="@+id/scrollView"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
- android:id="@+id/changeList"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
@@ -56,6 +56,22 @@
android:clickable="true"
android:src="@drawable/ic_refresh_black_48dp"
android:visibility="gone"/>
+
+ <LinearLayout
+ android:id="@+id/changeList"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+ </LinearLayout>
+
+ <ProgressBar
+ android:id="@+id/nextPageProgress"
+ android:layout_marginTop="3dp"
+ android:layout_marginBottom="3dp"
+ android:layout_width="match_parent"
+ android:layout_height="40dp"
+ android:indeterminate="true"
+ android:visibility="gone"/>
</LinearLayout>
</ScrollView>
</LinearLayout>