From 11914145e33adfbb58f0e235f8d323b2383f6071 Mon Sep 17 00:00:00 2001 From: AMIT SHEKHAR Date: Tue, 14 Mar 2017 17:06:47 +0530 Subject: [PATCH 01/72] Description for operators --- .../ui/networking/NetworkingActivity.java | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/networking/NetworkingActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/networking/NetworkingActivity.java index d883d86..f651870 100644 --- a/app/src/main/java/com/rxjava2/android/samples/ui/networking/NetworkingActivity.java +++ b/app/src/main/java/com/rxjava2/android/samples/ui/networking/NetworkingActivity.java @@ -40,10 +40,9 @@ protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_networking); } - /************************************ - * map operator start - ************************************/ - + /** + * Map Operator Example + */ public void map(View view) { Rx2AndroidNetworking.get("https://fierce-cove-29863.herokuapp.com/getAnUser/{userId}") .addPathParameter("userId", "1") @@ -84,13 +83,13 @@ public void onComplete() { } - /************************************ - * zip operator start - *********************************/ + /** + * zip Operator Example + */ - /* - * This observable return the list of User who loves cricket - */ + /** + * This observable return the list of User who loves cricket + */ private Observable> getCricketFansObservable() { return Rx2AndroidNetworking.get("https://fierce-cove-29863.herokuapp.com/getAllCricketFans") .build() @@ -168,9 +167,10 @@ public void zip(View view) { findUsersWhoLovesBoth(); } - /************************************ - * flatMap and filter operator start - ************************************/ + + /** + * flatMap and filter Operators Example + */ private Observable> getAllMyFriendsObservable() { return Rx2AndroidNetworking.get("https://fierce-cove-29863.herokuapp.com/getAllFriends/{userId}") @@ -220,9 +220,10 @@ public void onComplete() { }); } - /************************************ - * take operator start - ************************************/ + + /** + * take Operator Example + */ public void take(View view) { getUserListObservable() @@ -260,10 +261,9 @@ public void onComplete() { } - /************************************ - * flatMap operator start - ************************************/ - + /** + * flatMap Operator Example + */ public void flatMap(View view) { getUserListObservable() @@ -308,9 +308,9 @@ public void onComplete() { }); } - /************************************ - * flatMapWithZip operator start - ************************************/ + /** + * flatMapWithZip Operator Example + */ private Observable> getUserListObservable() { return Rx2AndroidNetworking.get("https://fierce-cove-29863.herokuapp.com/getAllUsers/{pageNumber}") From 1d44f0b618abc43a2b33b5af7725a2dea5c7d5d5 Mon Sep 17 00:00:00 2001 From: AMIT SHEKHAR Date: Wed, 15 Mar 2017 22:33:48 +0530 Subject: [PATCH 02/72] Add Paginator Example --- app/build.gradle | 1 + app/src/main/AndroidManifest.xml | 3 + .../android/samples/ui/SelectionActivity.java | 5 + .../ui/pagination/PaginationActivity.java | 145 ++++++++++++++++++ .../ui/pagination/PaginationAdapter.java | 59 +++++++ .../main/res/layout/activity_pagination.xml | 22 +++ .../main/res/layout/activity_selection.xml | 7 + app/src/main/res/layout/item_pagination.xml | 8 + app/src/main/res/values/strings.xml | 1 + 9 files changed, 251 insertions(+) create mode 100644 app/src/main/java/com/rxjava2/android/samples/ui/pagination/PaginationActivity.java create mode 100644 app/src/main/java/com/rxjava2/android/samples/ui/pagination/PaginationAdapter.java create mode 100644 app/src/main/res/layout/activity_pagination.xml create mode 100644 app/src/main/res/layout/item_pagination.xml diff --git a/app/build.gradle b/app/build.gradle index c12509c..525d899 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -23,6 +23,7 @@ dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:25.1.0' + compile 'com.android.support:recyclerview-v7:25.1.0' compile 'io.reactivex.rxjava2:rxjava:2.0.6' compile 'io.reactivex.rxjava2:rxandroid:2.0.1' compile 'com.amitshekhar.android:rx2-android-networking:0.0.1' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2e6e713..a6a3957 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -27,6 +27,9 @@ + diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/SelectionActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/SelectionActivity.java index 6395097..87ede3c 100644 --- a/app/src/main/java/com/rxjava2/android/samples/ui/SelectionActivity.java +++ b/app/src/main/java/com/rxjava2/android/samples/ui/SelectionActivity.java @@ -8,6 +8,7 @@ import com.rxjava2.android.samples.MyApplication; import com.rxjava2.android.samples.R; import com.rxjava2.android.samples.ui.networking.NetworkingActivity; +import com.rxjava2.android.samples.ui.pagination.PaginationActivity; import com.rxjava2.android.samples.ui.rxbus.RxBusActivity; public class SelectionActivity extends AppCompatActivity { @@ -30,4 +31,8 @@ public void startRxBusActivity(View view) { ((MyApplication) getApplication()).sendAutoEvent(); startActivity(new Intent(SelectionActivity.this, RxBusActivity.class)); } + + public void startPaginationActivity(View view) { + startActivity(new Intent(SelectionActivity.this, PaginationActivity.class)); + } } diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/pagination/PaginationActivity.java b/app/src/main/java/com/rxjava2/android/samples/ui/pagination/PaginationActivity.java new file mode 100644 index 0000000..9ff9bb2 --- /dev/null +++ b/app/src/main/java/com/rxjava2/android/samples/ui/pagination/PaginationActivity.java @@ -0,0 +1,145 @@ +package com.rxjava2.android.samples.ui.pagination; + +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.widget.ProgressBar; + +import com.rxjava2.android.samples.R; + +import org.reactivestreams.Publisher; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import io.reactivex.Flowable; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.annotations.NonNull; +import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.disposables.Disposable; +import io.reactivex.functions.Consumer; +import io.reactivex.functions.Function; +import io.reactivex.processors.PublishProcessor; + +/** + * Created by amitshekhar on 15/03/17. + */ + +public class PaginationActivity extends AppCompatActivity { + + public static final String TAG = PaginationActivity.class.getSimpleName(); + private CompositeDisposable compositeDisposable = new CompositeDisposable(); + private PublishProcessor paginator = PublishProcessor.create(); + private PaginationAdapter paginationAdapter; + private RecyclerView recyclerView; + private ProgressBar progressBar; + private boolean loading = false; + private int pageNumber = 1; + private int visibleThreshold = 3; + private int lastVisibleItem, totalItemCount; + private LinearLayoutManager layoutManager; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_pagination); + recyclerView = (RecyclerView) findViewById(R.id.recyclerView); + progressBar = (ProgressBar) findViewById(R.id.progressBar); + layoutManager = new LinearLayoutManager(this); + layoutManager.setOrientation(LinearLayoutManager.VERTICAL); + recyclerView.setLayoutManager(layoutManager); + paginationAdapter = new PaginationAdapter(); + recyclerView.setAdapter(paginationAdapter); + setUpLoadMoreListener(); + subscribeForData(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + compositeDisposable.clear(); + } + + private void setUpLoadMoreListener() { + recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrolled(RecyclerView recyclerView, + int dx, int dy) { + super.onScrolled(recyclerView, dx, dy); + + totalItemCount = layoutManager.getItemCount(); + lastVisibleItem = layoutManager + .findLastVisibleItemPosition(); + if (!loading + && totalItemCount <= (lastVisibleItem + visibleThreshold)) { + pageNumber++; + paginator.onNext(pageNumber); + loading = true; + } + } + }); + } + + private void subscribeForData() { + + Disposable disposable = paginator + .onBackpressureDrop() + .doOnNext(new Consumer() { + @Override + public void accept(@NonNull Integer integer) throws Exception { + loading = true; + progressBar.setVisibility(View.VISIBLE); + } + }) + .concatMap(new Function>>() { + @Override + public Publisher> apply(@NonNull Integer page) throws Exception { + return dataFromNetwork(page); + } + }) + .observeOn(AndroidSchedulers.mainThread()) + .map(new Function, Boolean>() { + @Override + public Boolean apply(@NonNull List items) throws Exception { + paginationAdapter.addItems(items); + paginationAdapter.notifyDataSetChanged(); + return true; + } + }) + .doOnNext(new Consumer() { + @Override + public void accept(@NonNull Boolean value) throws Exception { + loading = false; + progressBar.setVisibility(View.INVISIBLE); + } + }).subscribe(); + + compositeDisposable.add(disposable); + + paginator.onNext(pageNumber); + + } + + /** + * Simulation of network data + */ + private Flowable> dataFromNetwork(final int page) { + return Flowable.just(true) + .observeOn(AndroidSchedulers.mainThread()) + .delay(2, TimeUnit.SECONDS) + .map(new Function>() { + @Override + public List apply(@NonNull Boolean value) throws Exception { + List items = new ArrayList<>(); + for (int i = 1; i <= 10; i++) { + items.add("Item " + (page * 10 + i)); + } + return items; + } + }); + } +} diff --git a/app/src/main/java/com/rxjava2/android/samples/ui/pagination/PaginationAdapter.java b/app/src/main/java/com/rxjava2/android/samples/ui/pagination/PaginationAdapter.java new file mode 100644 index 0000000..9c9d162 --- /dev/null +++ b/app/src/main/java/com/rxjava2/android/samples/ui/pagination/PaginationAdapter.java @@ -0,0 +1,59 @@ +package com.rxjava2.android.samples.ui.pagination; + +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.rxjava2.android.samples.R; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by amitshekhar on 15/03/17. + */ + +public class PaginationAdapter extends RecyclerView.Adapter { + + List items = new ArrayList<>(); + + public PaginationAdapter() { + + } + + void addItems(List items) { + this.items.addAll(items); + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + return ItemViewHolder.create(parent); + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { + ((ItemViewHolder) holder).bind(items.get(position)); + } + + @Override + public int getItemCount() { + return items.size(); + } + + private static class ItemViewHolder extends RecyclerView.ViewHolder { + ItemViewHolder(View itemView) { + super(itemView); + } + + static ItemViewHolder create(ViewGroup parent) { + return new ItemViewHolder( + LayoutInflater.from(parent.getContext()).inflate(R.layout.item_pagination, parent, false)); + } + + void bind(String content) { + ((TextView) itemView).setText(content); + } + } +} diff --git a/app/src/main/res/layout/activity_pagination.xml b/app/src/main/res/layout/activity_pagination.xml new file mode 100644 index 0000000..f4a049b --- /dev/null +++ b/app/src/main/res/layout/activity_pagination.xml @@ -0,0 +1,22 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_selection.xml b/app/src/main/res/layout/activity_selection.xml index 3a0f1a7..afa4270 100644 --- a/app/src/main/res/layout/activity_selection.xml +++ b/app/src/main/res/layout/activity_selection.xml @@ -36,5 +36,12 @@ android:text="@string/rx_bus" android:textColor="@android:color/black" /> +