如何向 MvxListView 添加搜索功能 - Xamarin Android
How To Adding Search Functionality to MvxListView - Xamarin Android
我已经创建了列表并将其绑定到我的布局它现在工作正常我想在 MvxListView 中实现搜索功能
-代码
-型号
public class Language
{
public string Lang { get; set; }
}
语言服务Class
public async Task GetAllLanguageList(Action<ObservableCollection<Language>> successAction, Action<Exception> errorAction)
{
ObservableCollection<Language> AllLanguageList = new ObservableCollection<Language>();
AllLanguageList.Add(new Language { Lang = "Spanish"});
AllLanguageList.Add(new Language { Lang = "Portuguese"});
AllLanguageList.Add(new Language { Lang = "Manadarin"});
AllLanguageList.Add(new Language { Lang = "English"});
await System.Threading.Tasks.Task.Delay(TimeSpan.FromSeconds(0));
successAction(AllLanguageList);
}
在我的视图模型中,我已经为绑定做了所有这些思考
public ObservableCollection<Language> AllLanguageList { get; private set; }
AllLanguageList = new ObservableCollection<Language>();
所有代码工作正常
现在我想实现 Search
在我的客户端
edit_text_search = FindViewById<EditText>(Resource.Id.edit_text_search);
edit_text_search.TextChanged += InputSearch_TextChanged;
private void InputSearch_TextChanged(object sender, Android.Text.TextChangedEventArgs e)
{
//What should I write here?
}
Xaml代码
<Mvx.MvxListView
android:id="@+id/ListView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ffffff"
android:divider="@null"
android:dividerHeight="0dp"
local:MvxBind="ItemsSource LanguageList"
local:MvxItemTemplate="@layout/mainlist_template_all" />
一个非常简单的解决方案是:
- 而不是绑定到
AllLanguageList
绑定到新的 FilteredLanguageList
- 每当有人在搜索框或文本字段过滤器中输入内容时
AllLanguageList
并覆盖 FilteredLanguageList
的内容
非常幼稚和原始:
private List<string> _filteredLanguageList;
public List<string> FilteredLanguageList
{
get => _filteredLanguageList;
set
{
_filteredLanguageList = value;
NotifyPropertyChanged();
}
}
private string _searchQuery;
public string SearchQuery
{
get => _searchQuery;
set
{
_searchQuery = value;
FilterLanguages(_searchQuery);
}
}
在你的XAML中将你的ListView
ItemsSource
绑定到FilteredLanguageList
,并将你的Entry
Text
属性绑定到SearchQuery
.
然后在 FilterLanguages
中实现语言过滤。像这样的东西可以工作,但你需要根据自己的喜好进行调整:
private void FilterLanguages(string query)
{
FilteredLanguageList = AllLanguageList.Where(l =>
l.Lang.ToLowerInvariant()
.Contains(
query.ToLowerInvariant()).ToList();
}
我已经创建了列表并将其绑定到我的布局它现在工作正常我想在 MvxListView 中实现搜索功能 -代码 -型号
public class Language
{
public string Lang { get; set; }
}
语言服务Class
public async Task GetAllLanguageList(Action<ObservableCollection<Language>> successAction, Action<Exception> errorAction)
{
ObservableCollection<Language> AllLanguageList = new ObservableCollection<Language>();
AllLanguageList.Add(new Language { Lang = "Spanish"});
AllLanguageList.Add(new Language { Lang = "Portuguese"});
AllLanguageList.Add(new Language { Lang = "Manadarin"});
AllLanguageList.Add(new Language { Lang = "English"});
await System.Threading.Tasks.Task.Delay(TimeSpan.FromSeconds(0));
successAction(AllLanguageList);
}
在我的视图模型中,我已经为绑定做了所有这些思考
public ObservableCollection<Language> AllLanguageList { get; private set; }
AllLanguageList = new ObservableCollection<Language>();
所有代码工作正常 现在我想实现 Search
在我的客户端
edit_text_search = FindViewById<EditText>(Resource.Id.edit_text_search);
edit_text_search.TextChanged += InputSearch_TextChanged;
private void InputSearch_TextChanged(object sender, Android.Text.TextChangedEventArgs e)
{
//What should I write here?
}
Xaml代码
<Mvx.MvxListView
android:id="@+id/ListView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ffffff"
android:divider="@null"
android:dividerHeight="0dp"
local:MvxBind="ItemsSource LanguageList"
local:MvxItemTemplate="@layout/mainlist_template_all" />
一个非常简单的解决方案是:
- 而不是绑定到
AllLanguageList
绑定到新的FilteredLanguageList
- 每当有人在搜索框或文本字段过滤器中输入内容时
AllLanguageList
并覆盖FilteredLanguageList
的内容
非常幼稚和原始:
private List<string> _filteredLanguageList;
public List<string> FilteredLanguageList
{
get => _filteredLanguageList;
set
{
_filteredLanguageList = value;
NotifyPropertyChanged();
}
}
private string _searchQuery;
public string SearchQuery
{
get => _searchQuery;
set
{
_searchQuery = value;
FilterLanguages(_searchQuery);
}
}
在你的XAML中将你的ListView
ItemsSource
绑定到FilteredLanguageList
,并将你的Entry
Text
属性绑定到SearchQuery
.
然后在 FilterLanguages
中实现语言过滤。像这样的东西可以工作,但你需要根据自己的喜好进行调整:
private void FilterLanguages(string query)
{
FilteredLanguageList = AllLanguageList.Where(l =>
l.Lang.ToLowerInvariant()
.Contains(
query.ToLowerInvariant()).ToList();
}