You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:31:16