Xamarin Android中ListView搜索功能实现求助(JSON数据源)
我来帮你搞定这个ListView搜索的问题!结合你现有的代码,我们只需要对Adapter做一些修改,再加上搜索输入的监听逻辑就能实现简单的搜索功能了。
解决方案步骤
1. 修改CustomListAdapter,支持数据过滤
首先我们需要在Adapter中同时保留原始完整数据列表和过滤后的显示列表,这样搜索的时候可以基于原始数据进行筛选,而不是已经过滤过的数据。修改后的Adapter代码如下:
public class CustomListAdapter : BaseAdapter<Galeri> { Activity context; // 原始完整数据列表 List<Galeri> originalList; // 过滤后用于显示的列表 List<Galeri> filteredList; public CustomListAdapter(Activity _context, List<Galeri> _list) : base() { this.context = _context; this.originalList = _list; this.filteredList = new List<Galeri>(_list); } public override int Count { get { return filteredList.Count; } } public override long GetItemId(int position) { return position; } public override Galeri this[int index] { get { return filteredList[index]; } } // 添加搜索过滤方法 public void Filter(string searchText) { filteredList.Clear(); if (string.IsNullOrWhiteSpace(searchText)) { // 如果搜索框为空,显示全部数据 filteredList.AddRange(originalList); } else { // 根据搜索文本过滤,这里匹配meta_title、model、description字段,你可以按需调整 var filteredItems = originalList.Where(item => item.meta_title.IndexOf(searchText, StringComparison.OrdinalIgnoreCase) >= 0 || item.model.IndexOf(searchText, StringComparison.OrdinalIgnoreCase) >= 0 || item.description.IndexOf(searchText, StringComparison.OrdinalIgnoreCase) >= 0); filteredList.AddRange(filteredItems); } // 通知ListView数据已更新 NotifyDataSetChanged(); } public override View GetView(int position, View convertView, ViewGroup parent) { View view = convertView; if (view == null) view = context.LayoutInflater.Inflate(Resource.Layout.item, parent, false); Galeri item = this[position]; view.FindViewById<TextView>(Resource.Id.productname).Text = item.meta_title; view.FindViewById<TextView>(Resource.Id.category).Text = item.model; view.FindViewById<TextView>(Resource.Id.description).Text = item.description; using (var imageView = view.FindViewById<ImageView>(Resource.Id.Photo)) { string url = Android.Text.Html.FromHtml("http://www.termamed.com/store/image/"+item.image).ToString(); Koush.UrlImageViewHelper.SetUrlDrawable(imageView,url, Resource.Drawable.products); } return view; } }
2. 在MainActivity中添加搜索输入控件并监听事件
首先你需要在布局文件(比如Main.axml)中添加一个EditText作为搜索框,比如:
<EditText android:id="@+id/searchEditText" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="搜索商品..." android:inputType="text"/>
然后修改MainActivity的代码,保存Adapter的引用,并监听EditText的TextChanged事件:
// 声明全局的Adapter引用 CustomListAdapter galeriAdapter; protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.Main); DaftarGaleri = FindViewById<ListView>(Resource.Id.dataList); itemGaleri = new List<Galeri>(); var webClient = new WebClient(); webClient.DownloadStringAsync(BaseUri); progress = FindViewById<ProgressBar>(Resource.Id.progressBar); progress.Visibility = ViewStates.Visible; webClient.DownloadStringCompleted += WebClient_DownloadStringCompleted; // 获取搜索框并添加监听 var searchEditText = FindViewById<EditText>(Resource.Id.searchEditText); searchEditText.TextChanged += SearchEditText_TextChanged; } private void WebClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) { RunOnUiThread(() => { itemGaleri = JsonConvert.DeserializeObject<List<Galeri>>(e.Result); // 初始化Adapter并保存引用 galeriAdapter = new CustomListAdapter(this, itemGaleri); DaftarGaleri.Adapter = galeriAdapter; progress.Visibility = ViewStates.Gone; DaftarGaleri.ItemClick += DaftarGaleri_ItemClick; } ); } // 搜索文本变化时触发过滤 private void SearchEditText_TextChanged(object sender, Android.Text.TextChangedEventArgs e) { if (galeriAdapter != null) { string searchText = e.Text.ToString(); galeriAdapter.Filter(searchText); } }
3. 关键说明
- 我们在Adapter中分开了原始数据和过滤数据,这样每次搜索都是基于完整的数据源,避免多次过滤导致数据丢失。
- 过滤逻辑中使用了
StringComparison.OrdinalIgnoreCase来实现不区分大小写的搜索,你可以根据需求调整匹配的字段(比如只搜索meta_title)。 - 每次过滤后调用
NotifyDataSetChanged()通知ListView更新显示内容。
这样修改后,当用户在搜索框输入文本时,ListView就会实时显示匹配的条目了,完全适配你现有的JSON数据绑定逻辑。
内容的提问来源于stack exchange,提问作者Mr.Balaha
相关产品推荐
相关产品推荐

