xamarinxamarin.formsxamarin.forms.listview

Two search bar Xamarin Forms


I have a question here (I imagine it is for beginners: P).

I have a listview and a searchbar already working. I can make the right filter.

Then my question comes in, this listview has more than one column.

I can't think of a way to make 2 complementary filters.

For example:

Filter column 1 and then filter the result of that initial filter by column 2 (with another searchbar), that is, a filter on top of another filter.

My ListViewItem is like this with the filter:

C#

void InitList()
{
    Items = new List<ListViewItem>
    {
        new ListViewItem { Name = "Guilherme", Bairro = "BOTAFOGO"},

        new ListViewItem { Name = "João", Bairro = "FLAMENGO"},

        new ListViewItem { Name = "Maria", Bairro = "CENTRO"}
    }
}

void InitSearchBarBloco()
{
    sb_search_bloco.TextChanged += (s, e) => FilterItem(sb_search_bloco.Text);

    sb_search_bloco.SearchButtonPressed += (s, e) => 
        FilterItem(sb_search_bloco.Text);
}

private void FilterItem(string filter)
{
    exampleListView.BeginRefresh();

    if (string.IsNullOrWhiteSpace(filter))
    {
        exampleListView.ItemsSource = Items;
    }
    else
    {
        exampleListView.ItemsSource = Items.Where(x => x.Name.ToLower().Contains(filter.ToLower()));
    }

    exampleListView.EndRefresh();
}

XAML

<SearchBar x:Name="sb_search_bloco" Placeholder="Nome..." />

    <ListView x:Name="exampleListView" RowHeight="22" SelectedItem="{Binding Name}">

        <ListView.ItemTemplate>

            <DataTemplate>

                <ViewCell >

                    <Grid>

                        <Label Text="{Binding Name}" LineBreakMode="TailTruncation" />

                        <Label Grid.Column="1" Text="{Binding Bairro}" />

                    </Grid>

                </ViewCell>

            </DataTemplate>

        </ListView.ItemTemplate>            

</ListView>

With this structure I can implement this ... "filtrate filter"?

thanks


Solution

  • I guess the below code should do fine for you. You just need to alter your linq code inside the FilterItem(string filter) method to achieve your requirement.

    Note:

    I have used OR condition inside the where clause to search if the enter text is available in both Name and Bairro. However, you can modify the condition as you require.

    private void FilterItem(string filter)
    {
        exampleListView.BeginRefresh();
        if (string.IsNullOrWhiteSpace(filter))
        {
            exampleListView.ItemsSource = Items;
        }
        else
        {
            //Alter the condition like below or based on requirement to achieve the desired result. 
            exampleListView.ItemsSource = Items.Where(x => x.Name.ToLower().Contains(filter.ToLower()) || x.Bairro.ToLower().Contains(filter.ToLower()));
        }
        exampleListView.EndRefresh();
    }