android studio中的搜索查询无法正常工作

时间:2018-04-03 08:19:35

标签: android mysql jdbc android-asynctask

好的,所以我在listview中创建了搜索药物和显示项目的模块,我在这里使用JDBC。主要问题是当我在搜索视图中放置一个下划线_时,它会产生一个错误,其中listview项目会自行复制。

根据我的观察;只有在同时插入下划线时才会出现此错误,但如果以较慢的间隔按下,则无论如何都不会复制项目。

以下是SearchView上没有任何内容的内容:

enter image description here

当下划线放置的间隔较慢

enter image description here

即使下划线不存在于列表视图中,它仍会显示它,但当我添加更多下划线时,它们开始从底部开始一个接一个地消失。

这是主要问题;当同时放置下划线时

enter image description here

以下是我在AsyncTask中搜索的代码

private class searchUnfiltered extends AsyncTask<String, String, String> {

String z = "";
String fromSearchView = sv.getQuery().toString().trim();
boolean isSuccess = false;

String about;

@Override
protected void onPreExecute() {
    myArrayList2.clear();
    myArrayList.clear();
    super.onPreExecute();
}

@Override
protected String doInBackground(String... params) {

    try {
        Connection con = connectionClass.CONN();
        if (con == null) {
            z = "Please check your internet connection";
        } else {

            String querySearch = "select name from medicines where name like '%"+ fromSearchView +"%' order by name ASC";

            Statement stmt1 = con.createStatement();

            ResultSet rs1 = stmt1.executeQuery(querySearch);
            if(rs1 != null) {
                while (rs1.next()) {

                    myArrayList2.add(rs1.getString("name"));
                }
            }
        }
    } catch (Exception ex) {
        isSuccess = false;
        z = "Exceptions" + ex;
    }
    return z;
}

@Override
protected void onPostExecute(String s) {
    if(!isSuccess && !z.equals("")) {
        Toast.makeText(getBaseContext(), z, Toast.LENGTH_LONG).show();
    }

    ListAdapter listAdapter = new ArrayAdapter<>(MedicineSearch.this, android.R.layout.simple_list_item_1, myArrayList2);
    lv.setAdapter(listAdapter);
}
}

每当在搜索视图中更改值时,searchUnfiltered都会被触发,请告诉我我的工作是否有效,或者如果您有更好的建议,这将非常有用。

1 个答案:

答案 0 :(得分:1)

这是竞争条件的原因,你正在清除onPreExecute上的数据然后doInBackground工作正在快速输入5 _将清除5次,然后才能得到任何结果。

作为解决方案的举措:

myArrayList2.clear();// if this didn't work try myArrayList2 = new ArrayList<>();

从onPreExecute到doInBackground。