我尝试了这段代码,但迭代所有列表项目的时间太长了。
item_all
是一个列表,其中包含我从数据库中获取的数据。
et_Search.addTextChangedListener(new TextWatcher() {
int textlength;
long time = System.currentTimeMillis();
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
textlength = getSearchText().length();
item_filtered = new ArrayList<StockItem>();
long time = System.currentTimeMillis();
int i = 0;
do {
int startpost = 0;
int endpost = textlength;
boolean found;
do {
found = false;
if (getItemDesc(i).length() >= textlength
&& getSearchText().equalsIgnoreCase((String)getItemDesc(i).subSequence(startpost, endpost))) {
item_filtered.add(item_all.get(i));
found = true;
}
startpost++;
endpost++;
} while (endpost <= getItemDesc(i).length() && !found);
i++;
} while ((i < item_all.size()) && (item_filtered.size() <= 20));
Log.v("Time", "Time needed " + (System.currentTimeMillis() - time));
if (item_filtered.isEmpty())
AppendList(new ArrayList<StockItem>());
else
AppendList(item_filtered);
}
然后我尝试使用LIKE
try {
String[] WHATYOUWANT = { "*" };
String WHERECLAUSE = KEY_DESCRIPTION + " LIKE '%" + textIinput + "%' " ;
String GROUPBY = null;
String HAVING = null;
String ORDERBY = KEY_ROWID + " ASC LIMIT 0,100 ";
cursor = mDb.query(DATABASE_TABLE, WHATYOUWANT, WHERECLAUSE, null, GROUPBY, HAVING, ORDERBY);
} catch (Exception e) {
e.printStackTrace();
}
它的效果很好,但它并没有真正做到我想要的。
我想要的是搜索的项目与输入完全匹配。不,我输入“abc”,我不希望出现只包含“ab”或“bc”(不是“abc”)的项目。
答案 0 :(得分:0)
尝试使用contains()
代替equalsIgnoreCase()
。
if (getItemDesc(i).length() >= textlength
&& getItemDesc(i)
.contains(getSearchText()));
这可能会对你有所帮助。 :)