material-components / material-components/material-components-android
[Search] Unable to apply search string to RecyclerView
Nobody has claimed this yet.
- Dominant language
- Java
- Stars
- 17.4k
- Forks
- 3.2k
- PR merge metrics
- No merged PRs in 30d
Description
**Description:** I have below structure in my `activity_main.xml`, incl. `SearchBar` and `SearchView`, similar to the [documentation](https://github.com/material-components/material-components-android/blob/master/docs/components/Search.md). 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](https://github.com/material-components/material-components-android/blob/master/catalog/java/io/material/catalog/search/SearchRecyclerDemoActivity.java).
```
```
**Expected behavior:** This is how I understand the Material Design search functionality for my use case:
- I click on the `SearchBar`, the `SearchView` opens. I enter a search string, the original `RecyclerView` of the currently selected tab will be searched for the string and the results are shown in the `RecyclerView` with id `search_results_recycler_view` (i.e. the one within `SearchView`).
- With `setOnEditorActionListener` / `SearchView.getText`, I'm listening for the search string.
Setup:
- `SearchBar` and `SearchView` are defined in `MainActivity`
- `RecyclerView`s and `adapter`s are defined in the `fragment`s
- Custom `adapter` for `RecyclerView` has a getFilter() method implemented
The problem is that I'm not sure on how to...
a) transfer the search string from `SearchView` to the original `RecyclerView` list of the currently selected tab and then...
b) transfer the filtered list back to the `RecyclerView` with id `search_results_recycler_view` within `SearchView`.
Shall I use a `ViewModel` for each transfer part? Easy for a) where I can use `String`, but for b) it tricky as `ViewModel` doesn't allow an `ArrayList`?
The Catalog [RecyclerView Demo](https://github.com/material-components/material-components-android/blob/master/catalog/java/io/material/catalog/search/SearchRecyclerDemoActivity.java) 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 (e.g. in the documentation) on how to implement this (best practice) 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
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with docs/components/Search.md and catalog/java/io/material/catalog/search/SearchRecyclerDemoActivity.java, then trace activity_main.xml, the ViewPager2 fragments, and their RecyclerView adapters. Determine how the current tab, search text, and filtered results should be connected. Done means the documented pattern or catalog example performs a real search and displays the matching results in search_results_recycler_view.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- android, java, xml
- Domain
- documentation, mobile
- Issue type
- Documentation
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 30/100