Skip to content

Commit 154904e

Browse files
PatilShreyassamtstern
authored andcommitted
Add refresh() and fix retry() failing in FirestorePagingAdapter (#1609)
1 parent 9e89e0e commit 154904e

File tree

4 files changed

+46
-19
lines changed

4 files changed

+46
-19
lines changed

app/src/main/java/com/firebase/uidemo/database/firestore/FirestorePagingActivity.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import android.os.Bundle;
55
import android.support.annotation.NonNull;
66
import android.support.annotation.Nullable;
7+
import android.support.v4.widget.SwipeRefreshLayout;
78
import android.support.v7.app.AppCompatActivity;
89
import android.support.v7.widget.LinearLayoutManager;
910
import android.support.v7.widget.RecyclerView;
@@ -40,8 +41,8 @@ public class FirestorePagingActivity extends AppCompatActivity {
4041
@BindView(R.id.paging_recycler)
4142
RecyclerView mRecycler;
4243

43-
@BindView(R.id.paging_loading)
44-
ProgressBar mProgressBar;
44+
@BindView(R.id.swipe_refresh_layout)
45+
SwipeRefreshLayout mSwipeRefreshLayout;
4546

4647
private FirebaseFirestore mFirestore;
4748
private CollectionReference mItemsCollection;
@@ -72,7 +73,7 @@ private void setUpAdapter() {
7273
.setQuery(baseQuery, config, Item.class)
7374
.build();
7475

75-
FirestorePagingAdapter<Item, ItemViewHolder> adapter =
76+
final FirestorePagingAdapter<Item, ItemViewHolder> adapter =
7677
new FirestorePagingAdapter<Item, ItemViewHolder>(options) {
7778
@NonNull
7879
@Override
@@ -95,13 +96,13 @@ protected void onLoadingStateChanged(@NonNull LoadingState state) {
9596
switch (state) {
9697
case LOADING_INITIAL:
9798
case LOADING_MORE:
98-
mProgressBar.setVisibility(View.VISIBLE);
99+
mSwipeRefreshLayout.setRefreshing(true);
99100
break;
100101
case LOADED:
101-
mProgressBar.setVisibility(View.GONE);
102+
mSwipeRefreshLayout.setRefreshing(false);
102103
break;
103104
case FINISHED:
104-
mProgressBar.setVisibility(View.GONE);
105+
mSwipeRefreshLayout.setRefreshing(false);
105106
showToast("Reached end of data set.");
106107
break;
107108
case ERROR:
@@ -114,6 +115,13 @@ protected void onLoadingStateChanged(@NonNull LoadingState state) {
114115

115116
mRecycler.setLayoutManager(new LinearLayoutManager(this));
116117
mRecycler.setAdapter(adapter);
118+
119+
mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
120+
@Override
121+
public void onRefresh() {
122+
adapter.refresh();
123+
}
124+
});
117125
}
118126

119127
@Override
Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,12 @@
11
<?xml version="1.0" encoding="utf-8"?>
2-
<RelativeLayout
2+
<android.support.v4.widget.SwipeRefreshLayout
33
xmlns:android="http://schemas.android.com/apk/res/android"
44
xmlns:tools="http://schemas.android.com/tools"
5+
android:id="@+id/swipe_refresh_layout"
56
android:layout_width="match_parent"
67
android:layout_height="match_parent"
78
tools:context="com.firebase.uidemo.database.firestore.FirestorePagingActivity">
89

9-
<ProgressBar
10-
android:id="@+id/paging_loading"
11-
style="?android:attr/progressBarStyleHorizontal"
12-
android:layout_width="match_parent"
13-
android:layout_height="wrap_content"
14-
android:layout_marginTop="-6dp"
15-
android:background="@android:color/transparent"
16-
android:indeterminate="true"
17-
tools:ignore="NegativeMargin" />
18-
1910
<android.support.v7.widget.RecyclerView
2011
android:id="@+id/paging_recycler"
2112
android:layout_width="match_parent"
@@ -27,4 +18,4 @@
2718
android:clipToPadding="false"
2819
tools:listitem="@layout/item_item" />
2920

30-
</RelativeLayout>
21+
</android.support.v4.widget.SwipeRefreshLayout>

database/src/main/java/com/firebase/ui/database/paging/FirebaseRecyclerPagingAdapter.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,10 @@ public abstract class FirebaseRecyclerPagingAdapter<T, VH extends RecyclerView.V
3535
private final LiveData<FirebaseDataSource> mDataSource;
3636

3737

38-
//Data Source Observer
38+
/*
39+
LiveData created via Transformation do not have a value until an Observer is attached.
40+
We attach this empty observer so that our getValue() calls return non-null later.
41+
*/
3942
private final Observer<FirebaseDataSource> mDataSourceObserver = new Observer<FirebaseDataSource>() {
4043
@Override
4144
public void onChanged(@Nullable FirebaseDataSource source) {

firestore/src/main/java/com/firebase/ui/firestore/paging/FirestorePagingAdapter.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,17 @@ public abstract class FirestorePagingAdapter<T, VH extends RecyclerView.ViewHold
3434
private final LiveData<LoadingState> mLoadingState;
3535
private final LiveData<FirestoreDataSource> mDataSource;
3636

37+
/*
38+
LiveData created via Transformation do not have a value until an Observer is attached.
39+
We attach this empty observer so that our getValue() calls return non-null later.
40+
*/
41+
private final Observer<FirestoreDataSource> mDataSourceObserver = new Observer<FirestoreDataSource>() {
42+
@Override
43+
public void onChanged(@Nullable FirestoreDataSource source) {
44+
45+
}
46+
};
47+
3748
private final Observer<LoadingState> mStateObserver =
3849
new Observer<LoadingState>() {
3950
@Override
@@ -104,13 +115,26 @@ public void retry() {
104115
source.retry();
105116
}
106117

118+
/**
119+
* To attempt to refresh the list. It will reload the list from beginning.
120+
*/
121+
public void refresh(){
122+
FirestoreDataSource mFirebaseDataSource = mDataSource.getValue();
123+
if (mFirebaseDataSource == null) {
124+
Log.w(TAG, "Called refresh() when FirestoreDataSource is null!");
125+
return;
126+
}
127+
mFirebaseDataSource.invalidate();
128+
}
129+
107130
/**
108131
* Start listening to paging / scrolling events and populating adapter data.
109132
*/
110133
@OnLifecycleEvent(Lifecycle.Event.ON_START)
111134
public void startListening() {
112135
mSnapshots.observeForever(mDataObserver);
113136
mLoadingState.observeForever(mStateObserver);
137+
mDataSource.observeForever(mDataSourceObserver);
114138
}
115139

116140
/**
@@ -121,6 +145,7 @@ public void startListening() {
121145
public void stopListening() {
122146
mSnapshots.removeObserver(mDataObserver);
123147
mLoadingState.removeObserver(mStateObserver);
148+
mDataSource.removeObserver(mDataSourceObserver);
124149
}
125150

126151
@Override

0 commit comments

Comments
 (0)