首页 > 解决方案 > 在我隐藏键盘之前,在 SearchView 上键入时 ListView 不会更新

问题描述

我正在创建一个连接到 Azure 搜索服务的 Android 应用。我添加了一个 SearchView 和一个 ListView。这个想法是,当我在 SearchView 上键入时,我会从 Azure Search 获得实时结果,并将它们作为常见功能显示在 ListView 上。

我遇到的问题是在显示 Android 键盘时 ListView 没有得到更新。所以最初 ListView 是空的,我在 SearchView 中键入了几个字母,ListView 上什么也没有出现,但是如果我点击 Android 后退按钮(此时是向下按钮)来隐藏 Android 键盘,然后 ListView 被填充并且出现搜索结果。

如果我输入 3、4 或更多字母,我会看到正确的结果,但只有当我隐藏键盘时。

这基本上是我的代码:

private SearchView searchView;
private ListView listView;
private ArrayAdapter<string> adapter;

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);

    SetContentView(Resource.Layout.activity_main);

    searchView = FindViewById<SearchView>(Resource.Id.searchBox);
    listView = FindViewById<ListView>(Resource.Id.searchResult);

    adapter = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleListItem1);
    listView.Adapter = adapter;

    searchView.QueryTextChange += SearchView_QueryTextChange;
}

private void SearchView_QueryTextChange(object sender, SearchView.QueryTextChangeEventArgs e)
{
    adapter.Clear();
    if (e.NewText.Length > 1)
    {
        searchTerm(e.NewText);
    }
}

private async void searchTerm(string newText)
{
    var client = new RestClient("mysearchengine.search.windows.net");
    var request = new RestRequest("indexes/myitems/docs/search", Method.POST);

    request.AddParameter("api-version", "2017-11-11", ParameterType.QueryString);
    request.AddHeader("api-key", "MYKEY");
    request.AddHeader("content-type", "application/json");
    request.RequestFormat = DataFormat.Json;
    request.AddBody(new { search = newText + "*", select = "id, title" });

    try {
        await Task.Run(() => {
        IRestResponse response = client.Execute(request);
        if (response.StatusDescription == "OK")
        {
            string values = response.Content;
            List<MyPost> myPosts = JsonConvert.DeserializeObject<List<MyPost>>(values);
            List<string> items = new List<string>();
            for(int i=0;i<myPosts.Count;i++)
            {
                items.Add(myPosts[i].Title + " (" + myPosts[i].ID + ")");
            }
            adapter.AddAll(items);
            adapter.NotifyDataSetChanged();
        }
    });
}
    catch(Exception e) { }
}

提前致谢!

标签: c#androidlistviewxamarinsearchview

解决方案


推荐阅读