material-components / material-components/material-components-android

[Search] Unable to apply search string to RecyclerView

Open
#4,348 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug Widget: Search
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

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.