diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index ea6e0336f..9c29fc809 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -59,7 +59,7 @@
+ android:label="@string/title_realtime_database_paging_activity" />
options = new DatabasePagingOptions.Builder()
+ DatabasePagingOptions- options = new DatabasePagingOptions.Builder
- ()
.setLifecycleOwner(this)
- .setQuery(mQuery, config, Post.class)
+ .setQuery(mQuery, config, Item.class)
.build();
//Initializing Adapter
- final FirebaseRecyclerPagingAdapter mAdapter =
- new FirebaseRecyclerPagingAdapter(options) {
+ final FirebaseRecyclerPagingAdapter
- mAdapter =
+ new FirebaseRecyclerPagingAdapter
- (options) {
@NonNull
@Override
- public PostViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
+ public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
int viewType) {
View view = LayoutInflater.from(parent.getContext())
- .inflate(R.layout.item_post, parent, false);
- return new PostViewHolder(view);
+ .inflate(R.layout.item_item, parent, false);
+ return new ItemViewHolder(view);
}
@Override
- protected void onBindViewHolder(@NonNull PostViewHolder holder,
+ protected void onBindViewHolder(@NonNull ItemViewHolder holder,
int position,
- @NonNull Post model) {
+ @NonNull Item model) {
holder.bind(model);
}
@@ -90,18 +96,15 @@ protected void onLoadingStateChanged(@NonNull LoadingState state) {
case LOADING_MORE:
mSwipeRefreshLayout.setRefreshing(true);
break;
-
case LOADED:
mSwipeRefreshLayout.setRefreshing(false);
break;
-
case FINISHED:
mSwipeRefreshLayout.setRefreshing(false);
- Toast.makeText(getApplicationContext(), getString(R.string.paging_finished_message), Toast.LENGTH_SHORT).show();
+ showToast(getString(R.string.paging_finished_message));
break;
-
case ERROR:
- retry();
+ showToast(getString(R.string.unknown_error));
break;
}
}
@@ -109,7 +112,7 @@ protected void onLoadingStateChanged(@NonNull LoadingState state) {
@Override
protected void onError(DatabaseError databaseError) {
mSwipeRefreshLayout.setRefreshing(false);
- Log.e(TAG, databaseError.getMessage());
+ Log.e(TAG, databaseError.getDetails(), databaseError.toException());
}
};
@@ -126,35 +129,71 @@ public void onRefresh() {
});
}
- public static class Post {
- @Nullable public String title;
- @Nullable public String body;
+ @Override
+ public boolean onCreateOptionsMenu(@NonNull Menu menu) {
+ getMenuInflater().inflate(R.menu.menu_paging, menu);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(@NonNull MenuItem item) {
+ if (item.getItemId() == R.id.item_add_data) {
+ showToast("Adding data...");
+ createItems();
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ @NonNull
+ private void createItems() {
+ for (int i = 0; i < 250; i++) {
+ String title = "Item " + i;
- public Post(){}
+ String id = String.format(Locale.getDefault(), "item_%03d", i);
+ Item item = new Item(title, i);
- public Post(@Nullable String title, @Nullable String body) {
- this.title = title;
- this.body = body;
+ mDatabase.getReference("items").child(id).setValue(item);
}
}
- public static class PostViewHolder extends RecyclerView.ViewHolder {
+ private void showToast(@NonNull String message) {
+ Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
+ }
+
+
+ public static class Item {
+
+ @Nullable
+ public String text;
+ public int value;
+
+ public Item(){}
+
+ public Item(@Nullable String text, int value) {
+ this.text = text;
+ this.value = value;
+ }
+ }
+
+ public static class ItemViewHolder extends RecyclerView.ViewHolder {
+
- @BindView(R.id.textViewTitle)
- TextView mTitleView;
+ @BindView(R.id.item_text)
+ TextView mTextView;
- @BindView(R.id.textViewBody)
- TextView mBodyView;
+ @BindView(R.id.item_value)
+ TextView mValueView;
- PostViewHolder(@NonNull View itemView) {
+ ItemViewHolder(@NonNull View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
- void bind(@NonNull Post post) {
- mTitleView.setText(post.title);
- mBodyView.setText(post.body);
+ void bind(@NonNull Item item) {
+ mTextView.setText(item.text);
+ mValueView.setText(String.valueOf(item.value));
}
}
diff --git a/app/src/main/res/layout/activity_database_paging.xml b/app/src/main/res/layout/activity_database_paging.xml
index 751889915..8ef7a591e 100644
--- a/app/src/main/res/layout/activity_database_paging.xml
+++ b/app/src/main/res/layout/activity_database_paging.xml
@@ -16,6 +16,6 @@
android:paddingLeft="16dp"
android:paddingTop="8dp"
android:paddingRight="16dp"
- tools:listitem="@layout/item_post" />
+ tools:listitem="@layout/item_item" />
diff --git a/app/src/main/res/layout/item_post.xml b/app/src/main/res/layout/item_post.xml
deleted file mode 100644
index 6837e0cfa..000000000
--- a/app/src/main/res/layout/item_post.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/menu/menu_firestore_paging.xml b/app/src/main/res/menu/menu_paging.xml
similarity index 100%
rename from app/src/main/res/menu/menu_firestore_paging.xml
rename to app/src/main/res/menu/menu_paging.xml
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 851cf1c88..eab83fdfc 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -2,11 +2,11 @@
Firebase UI
- Auth UI demo
+ Auth UI Demo
Cloud Firestore Demo
Cloud Firestore Paging Demo
- Real-time database demo
- Paging database demo
+ Realtime Database Demo
+ Realtime Database Paging Demo
Storage Image Demo
Demonstrates the Firebase Auth UI flow, with customization options.
@@ -14,7 +14,7 @@
Demonstrates using a FirestoreRecyclerAdapter to load data from Cloud Firestore into a RecyclerView for a basic chat app.
Demonstrates using a FirestorePagingAdapter to load/infinite scroll paged data from Cloud Firestore.
Demonstrates using a FirebaseRecyclerAdapter to load data from Firebase Database into a RecyclerView for a basic chat app.
- Demonstrates using a FirebaseRecyclerPagingAdapter to load/infinite scroll paged data from Firebase Database.
+ Demonstrates using a FirebaseRecyclerPagingAdapter to load/infinite scroll paged data from Firebase Realtime Database.
Demonstrates displaying an image from Cloud Storage using Glide.
@@ -120,8 +120,6 @@
No messages. Start chatting at the bottom!
Signing in…
Signed In
- Title
- Body
Anonymous authentication failed, various components of the demo will not work.
Make sure your device is online and that Anonymous Auth is configured in your Firebase project
diff --git a/database/src/main/java/com/firebase/ui/database/paging/FirebaseDataSource.java b/database/src/main/java/com/firebase/ui/database/paging/FirebaseDataSource.java
index d7a2fad02..a99e26a45 100644
--- a/database/src/main/java/com/firebase/ui/database/paging/FirebaseDataSource.java
+++ b/database/src/main/java/com/firebase/ui/database/paging/FirebaseDataSource.java
@@ -34,9 +34,9 @@ public class FirebaseDataSource extends PageKeyedDataSource mLoadingState = new MutableLiveData<>();
private final MutableLiveData mError = new MutableLiveData<>();
- private static final String STATUS_DATABASE_NOT_FOUND = "DATABASE NOT FOUND";
- private static final String MESSAGE_DATABASE_NOT_FOUND = "Database not found at given child path !";
- private static final String DETAILS_DATABASE_NOT_FOUND = "Database Children Not Found in the specified child path. Please specify correct child path/reference";
+ private static final String STATUS_DATABASE_NOT_FOUND = "DATA_NOT_FOUND";
+ private static final String MESSAGE_DATABASE_NOT_FOUND = "Data not found at given child path!";
+ private static final String DETAILS_DATABASE_NOT_FOUND = "No data was returned for the given query: ";
private Runnable mRetryRunnable;
@@ -214,10 +214,11 @@ private String getLastPageKey(@NonNull List data) {
}
private void setDatabaseNotFoundError(){
+ String details = DETAILS_DATABASE_NOT_FOUND + mQuery.toString();
mError.postValue(DatabaseError.fromStatus(
STATUS_DATABASE_NOT_FOUND,
- DETAILS_DATABASE_NOT_FOUND,
- MESSAGE_DATABASE_NOT_FOUND));
+ MESSAGE_DATABASE_NOT_FOUND,
+ details));
mLoadingState.postValue(LoadingState.ERROR);
}