2

这是我在android中的第一个应用程序。我想知道这是否是最好的方法。我正在尝试使用 mysql db 中的数据加载自动完成文本视图。该数据是根据用户输入的文本从 db 中检索的。

这就是我的做法。

1.在自动完成视图中添加了一个 textwatch 监听器。在 afterTextchanged 方法中,我正在调用一个异步任务,该任务使用 php Web 服务连接到 db,并从 mysql 表中检索数据并加载到数组中。在执行该任务后,我正在设置适配器。(阵列适配器)。

我的问题是,对于输入/修改的每个字母都会调用 aftertextchanged,db 调用在这里发生。那么,把所有的数据库代码都保存在这里,好吗?加载列表也需要时间。

有没有其他最好的方法来做到这一点。

感谢您的答复。

4

2 回答 2

2

当一个新字符添加到输入框时,取消正在进行AsyncTask的获取建议并使用新参数开始一个新字符。并向用户指示正在加载建议,以便用户可以选择等待,如果他愿意。

这是一篇解释取消的理想方法的帖子AsyncTask取消正在执行的 AsyncTask的理想方法

更新:

如果您缓存第一个字符输入时的所有结果(无需取消),您可以随着用户在编辑框中键入更多字符而逐渐加快速度Asynctask,因为这将是初始列表,其中包含从第一个开始的所有字符串特点。以下所有结果(在新字符上,即第 2、第 3 ..)将是此列表的子集。使用 管理列表ArrayAdapter。编辑框应该是一个AutoCompleteTextView。

这样,您只需要为第一个字符运行 asynctask。

更新 2: 您可以在onCreate. 听起来是个更好的选择。。

    AutoCompleteTextView act = 
                        (AutoCompleteTextView)findViewById(R.id.act_contact);
    ContentResolver content = getContentResolver();
    Cursor cursor = content.query(
                            ContactsContract.Contacts.CONTENT_URI, 
                            PEOPLE_PROJECTION, null, null, null);
    ContactListAdapter adapter = new ContactListAdapter(this, cursor);
    act.setAdapter(adapter);
于 2012-09-21T10:54:14.923 回答
0

您可以尝试使用 Android 本地 DB 从您的服务器存储数据,然后使用本地 DB 填充您的 ArrayAdapter,这肯定会提高性能。

希望能帮助到你 ...

于 2012-09-21T11:07:04.170 回答