[Search] Unable to apply search string to RecyclerView
Description: I have below structure in my activity_main.xml, incl. SearchBar and SearchView, similar to the documentation. I'm using a ViewPager2 with fragments (one for each tab of the TabLayout, including each a RecyclerView list). Basically, the GUI looks like the Catalog app RecyclerView Demo.
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:layoutDirection="locale"
android:textDirection="locale"
tools:context=".MainActivity">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:stateListAnimator="@null"
android:fitsSystemWindows="true">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?attr/actionBarSize"
app:layout_scrollFlags="scroll|enterAlways|snap"
app:layout_scrollEffect="compress" />
<com.google.android.material.tabs.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:contentDescription="@string/app_name"
app:layout_scrollFlags="scroll|enterAlways"
app:tabMode="scrollable" />
<com.google.android.material.search.SearchBar
android:id="@+id/search_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="searchbar_hint" />
</com.google.android.material.appbar.AppBarLayout>
<com.google.android.material.search.SearchView
android:id="@+id/search_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:hint="searchview_hint"
app:layout_anchor="@id/search_bar">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/search_results_recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical" />
</com.google.android.material.search.SearchView>
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipChildren="false"
android:clipToPadding="false"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
Expected behavior: This is how I understand the Material Design search functionality for my use case:
- I click on the
SearchBar, theSearchViewopens. I enter a search string, the originalRecyclerViewof the currently selected tab will be searched for the string and will show the results in theRecyclerViewwith idsearch_results_recycler_view(i.e. the one withinSearchView). - With
setOnEditorActionListener/SearchView.getText, I'm listening for the search string.
Additionally...
-
SearchBarandSearchVieware defined inMainActivity -
RecyclerViews andadapters are defined in thefragments - Custom
adapterforRecyclerViewhas a getFilter() method implemented
The problem is that I don't see any solution on how to apply the search string from SearchView (MainActivity) to the original RecyclerView list of the currently selected tab and then transfer the filtered list to the RecyclerView with id search_results_recycler_view within SearchView.
Your Catalog RecyclerView Demo also doesn't show how to do that as all search results are hard-coded and have no association with the original text, so entering a search string has no effect.
Can you please share some insights on how to implement this or would you be able to amend the Catalog demo accordingly?
Source code: See above XML code.
Android API version: Tested on Android API 30-35
Material Library version: 1.13.0-alpha07
Device: Pixel 8 emulators, Nokia 7.2