C# 在ListView项目中搜索时,xamarin iOS c搜索栏卡住,工作速度非常慢

C# 在ListView项目中搜索时,xamarin iOS c搜索栏卡住,工作速度非常慢,c#,ios,mysql,xamarin,searchbar,C#,Ios,Mysql,Xamarin,Searchbar,用法:Visual Studio for Mac上的Xamarin 我有一个示例搜索栏,其中包含来自带有位置的数据库的填充ListView。 当我启动应用程序时,我会在ListView中看到位置,但当我单击搜索栏并想从数据库中搜索某个项目时,搜索栏被卡住了。。 示例:我尝试输入Plovdiv。。但是我不能。。。只要输入P。。。25秒后,搜索输入l。。。40秒后,我看到另一个o。。搜索栏的工作速度非常慢 MainPage.cs中的我的代码: public partial class MainPa

用法:Visual Studio for Mac上的Xamarin

我有一个示例搜索栏,其中包含来自带有位置的数据库的填充ListView。 当我启动应用程序时,我会在ListView中看到位置,但当我单击搜索栏并想从数据库中搜索某个项目时,搜索栏被卡住了。。 示例:我尝试输入Plovdiv。。但是我不能。。。只要输入P。。。25秒后,搜索输入l。。。40秒后,我看到另一个o。。搜索栏的工作速度非常慢

MainPage.cs中的我的代码:

 public partial class MainPage : ContentPage
{
    public string GlobalLat;
    public string GlobalLong;

    private MySqlConnection connection;
    private string server;
    private string database;
    private string uid;
    private string password;



    public MainPage()
    {
        InitializeComponent();

        listView.ItemsSource = GetContacts();
        this.BindingContext = this;

        Task task = GetUserLocationAsync();
    }

    public class Contacts
    {
        public string Place { get; set; }
    }

    IEnumerable<Contacts> GetContacts(string searchText = null)
    {
        server = "192.168.0.1,3306";
        database = "dbName";
        uid = "username";
        password = "";
        string connectionString;
        connectionString = "SERVER=" + server + ";" + "DATABASE=" +
        database + ";" + "UID=" + uid + ";" + "PASSWORD=" + password + ";";
        connection = new MySqlConnection(connectionString);
        connection.Open();
        var cmd = new MySqlCommand();
        cmd.Connection = connection;

        var contacts = new List<Contacts>();

        MySqlCommand command = new MySqlCommand($"SELECT place FROM places ORDER BY place", connection);

        using (MySqlDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                var place = new Contacts
                {
                    Place = reader[0].ToString()
                };

                contacts.Add(place);

            }
            connection.Close();
        }

        if (string.IsNullOrEmpty(searchText))
            return contacts;
        return contacts.Where(p => p.Place.StartsWith(searchText));
    }

    private void ListView_Refreshing(object sender, EventArgs e)
    {
        listView.ItemsSource = GetContacts();
        listView.EndRefresh();
    }
}
void SearchBar_TextChanged(System.Object sender, Xamarin.Forms.TextChangedEventArgs e)
    {
        listView.ItemsSource = GetContacts(e.NewTextValue);
    }

    void Btn_Search(System.Object sender, System.EventArgs e)
    {

    }
}
这是MainPage.xaml文件中的代码:

<StackLayout>  
            <SearchBar
               Placeholder="Enter city"
               TextChanged="SearchBar_TextChanged"
               SearchButtonPressed="Btn_Search"></SearchBar>  
            <ListView
                HeightRequest="250"
                x:Name="listView" >  
                <ListView.ItemTemplate>  
                    <DataTemplate>  
                        <TextCell Text="{Binding Place}">  
                    </TextCell>  
                    </DataTemplate>  
                </ListView.ItemTemplate>  
            </ListView>  
        </StackLayout>
所以搜索速度非常慢,每次我碰到她并想搜索时,他都卡住了


有没有办法解决这个问题?

首先,保留一个本地联系人列表,您不需要每次都从远程数据库刷新

List<Contact> data;

public MainPage()
{
    InitializeComponent();

    listView.ItemsSource = data = GetContacts();
    this.BindingContext = this;

    Task task = GetUserLocationAsync();
}

您是否仍在将数据库中的1000行加载到UI中?为什么你没有发布任何搜索按钮事件处理程序?你能告诉我怎么做吗?每次你键入一个字符,你就是在打开一个SQL连接,查询整个数据库,然后过滤结果。因此,如果他们输入4个字符,则会执行四次。那是非常昂贵的。只过滤内存中已有的数据集会更有效。
void SearchBar_TextChanged(System.Object sender, Xamarin.Forms.TextChangedEventArgs e)
{
    listView.ItemsSource = data.Where(p => p.Place.StartsWith(e.NewTextValue));
}