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); }