In Android, recyclerview is majorly used component to show the item list data into recyclerview. Showing the list of data from a database or an API is pretty easy. But I am not going into the deep concept how we are using the recyclerview to show the data from API or database. In this tutorial, I am focusing about to filter the item of recyclerview in between the range of given numbers.
In many application, mainly in product type application, we have seen to filter the item based on price in between the range is very common. So in this tutorial, we will learn how can we filter the recyclerview item in between the range. Suppose you have thousands of product items showing on recyclerview. In this case to pick any particular item from a scroll is very difficult. To make this easy we can use filter the item based on search or sort the product name in the alphabet. I would be recommended to check this post to make the recyclerview search and sort is very easy to find any product. Here is post detail Android Filter Recyclerview by using SearchView in ToolBar or action bar.
For using the recyclerview we need to add the recyclerview dependency in our build.gradle file and for filtering item in between the range I am using a third party dependency material range bar.
compile 'com.android.support:recyclerview-v7:26.0.1' compile 'com.appyvet:materialrangebar:1.4'
OK, that’s all basic required thing to filter items in between the range. I am filtering the data from a database. I used the GreenDao database to filter the item. If you do not aware of the Green DAO then I would be recommended to check this post in detail to get understand about the Green Dao fast ORM. Here is the link for Exploring GreenDAO ORM database with Reactive RxJava in Android.
Here is the uploaded the video for filter the item of recyclerview in between the range of the number of backers by using the material range bar. Please check the video to get understand what we can do with the filter?
Great, let’s see how can we do with source code. As we have seen in the video that I used the popup dialog for the filter the items in between the range of numbers by using the material range bar. I used the material dialog to provides the material kind of feeling so that our user interface will look good and attractive for users.
public class DialogUtil { static int mLeftValue = 10000; static int mRightValue = 300000; public static void materialRangeDialog(final Context ctx , final String message , final DialogCallback dialogCallback, boolean isCancalable) { boolean wrapInScrollView = false; final MaterialDialog dialog = new MaterialDialog.Builder(ctx).customView(R.layout.layout_dialog, wrapInScrollView).backgroundColorRes(android.R.color.transparent).build(); dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.WHITE)); View dialogView = dialog.getView(); RangeBar rangebar = (RangeBar) dialogView.findViewById(R.id.rangebar); rangebar.setFormatter(new IRangeBarFormatter() { @Override public String format(String s) { int data = Integer.valueOf(s); int updatedValue = data * 10000; return String.valueOf(updatedValue); } }); rangebar.setOnRangeBarChangeListener(new RangeBar.OnRangeBarChangeListener() { @Override public void onRangeChangeListener(RangeBar rangeBar, int leftPinIndex, int rightPinIndex, String leftPinValue, String rightPinValue) { mLeftValue = Integer.valueOf(leftPinValue) * 10000; mRightValue = Integer.valueOf(rightPinValue) * 10000; } }); Button cancelButton = (Button) dialogView.findViewById(R.id.cancel_button); Button doneButton = (Button) dialogView.findViewById(R.id.done_button); dialog.setCancelable(isCancalable); dialog.show(); cancelButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialogCallback.onCancel(); dialog.dismiss(); } }); doneButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialogCallback.onDane(String.valueOf(mLeftValue), String.valueOf(mRightValue)); dialog.dismiss(); } }); } }
And here are layout_dialog XML detail.
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical" android:layout_width="match_parent" android:paddingTop="10dp" android:paddingBottom="10dp" android:layout_height="match_parent" android:layout_centerInParent="true"> <TextView android:gravity="center" android:textSize="17sp" android:text="Filter by backers" android:layout_width="match_parent" android:layout_height="wrap_content" /> <com.appyvet.materialrangebar.RangeBar android:layout_below="@+id/checkbox" android:id="@+id/rangebar" android:layout_width="match_parent" android:layout_marginTop="5dp" android:layout_height="72dp" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" app:mrb_pinRadius="20dp" app:mrb_pinMaxFont="10sp" app:mrb_rangeBarPaddingBottom="12dp" app:mrb_selectorBoundaryColor="@color/colorPrimary" app:mrb_selectorBoundarySize="2dp" app:mrb_pinTextColor="#ACD123" app:mrb_selectorSize="10dp" app:mrb_tickEnd="30" app:mrb_tickInterval="1" app:mrb_tickStart="1"/> <LinearLayout android:layout_margin="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_below="@+id/rangebar"> <Button android:id="@+id/cancel_button" android:text="Cancel" android:background="@color/colorPrimary" android:textColor="#fff" android:layout_margin="10dp" android:textAllCaps="false" android:layout_width="wrap_content" android:layout_height="40dp" /> <Button android:id="@+id/done_button" android:text="Done" android:background="@color/colorPrimary" android:textColor="#fff" android:layout_margin="10dp" android:textAllCaps="false" android:layout_width="wrap_content" android:layout_height="40dp" /> </LinearLayout> </RelativeLayout>
Now I need callback when button action happen. So I used the interface for a callback.
public interface DialogCallback { void onDane(String leftValue, String rightValues); void onCancel(); }
Ok now we need to call this method to execute, but before we need to get the filtered data from the database. Here is used a query to filter.
@Override public Flowable<List<KickStarter>> getKickStarterByBackers(final String leftValue, final String rightValue) { return Flowable.fromCallable(new Callable<List<KickStarter>>() { @Override public List<KickStarter> call() throws Exception { Timber.d("getKickStartersQuery: " + "Left: "+leftValue + " Right: "+rightValue); List<KickStarter> list = getKickStarterDao().queryBuilder() .where(KickStarterDao.Properties.Num_backers.between(leftValue, rightValue)) .list(); Timber.d("getKickStartersQuery: " + list.size()); return list; } }); }
Ok, Let’s call the method to execute the filter and update the recyclerview by using the notifyDataSetChange.
private void filerChoice() { DialogUtil.materialRangeDialog(getActivity(), "", dialogCallback, false); } DialogCallback dialogCallback = new DialogCallback() { @Override public void onDane(String leftValue, String rightValues) { mPresenter.queryKickStarterDb(leftValue, rightValues); } @Override public void onCancel() { } };
That’s it. Let’s implement the same thing in your application.
Please do subscribe your email to get every newsletter from this blog and if you feel that this post helps you then do not forget to share and comment below.
Happy Coding 🙂
I am a very enthusiastic Android developer to build solid Android apps. I have a keen interest in developing for Android and have published apps to the Google Play Store. I always open to learning new technologies. For any help drop us a line anytime at contact@mobologicplus.com
Can u please Give Complete Code I m New to Android ….???
@Waheed thanks, I will target to provide full source code in my upcoming articles.
I need This right now…provide as soon as possible
can you please send me recyclerview java code where filter apply
Hi Hamza, As in recylcerviw has not much change, it just gets the sorted list and updates the view.
I am sorry to say but this tutorial is completely useless because there is no complete information, such as what is mPresenter? what isFlowable? what is KickStarterDao?
-_-