好的,所以我在listview中创建了搜索药物和显示项目的模块,我在这里使用JDBC。主要问题是当我在搜索视图中放置一个下划线_
时,它会产生一个错误,其中listview项目会自行复制。
根据我的观察;只有在同时插入下划线时才会出现此错误,但如果以较慢的间隔按下,则无论如何都不会复制项目。
以下是SearchView上没有任何内容的内容:
当下划线放置的间隔较慢
时即使下划线不存在于列表视图中,它仍会显示它,但当我添加更多下划线时,它们开始从底部开始一个接一个地消失。
这是主要问题;当同时放置下划线时
以下是我在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
都会被触发,请告诉我我的工作是否有效,或者如果您有更好的建议,这将非常有用。
答案 0 :(得分:1)
这是竞争条件的原因,你正在清除onPreExecute上的数据然后doInBackground工作正在快速输入5 _将清除5次,然后才能得到任何结果。
作为解决方案的举措:
myArrayList2.clear();// if this didn't work try myArrayList2 = new ArrayList<>();
从onPreExecute到doInBackground。