我使用EditText
和ListView
在Android中制作程序。我想使用上面的ListView
搜索EditText
项目。将数据填充到ListView
后,当用户在EditText
中输入文字时,ListView
将滚动到该文字的位置开头。示例:我有项目: [苹果,应用程序,书籍,男孩,汽车,猫,现金.....] 当我在EditText
中输入b然后ListView
将滚动到预订。我想使用listview.setSelection(position)
,但我不知道如何从EditText
搜索获得该位置。我使用下面的代码,它运行良好,但是当我们在EditText
中搜索时,它似乎很慢。我怎么能这样做并顺利运行?
谢谢你的进步。
我使用以下代码:
YOUR_EDITTEXT.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, int count) {
//LOGIC MAY DIFFER ACCORDING TO YOUR REQUIREMENT..
int POSITION = 0;
for(int i =0;i<list.size();i++) {
if(list.get(i).startsWith(s.toString()))
{
POSITION = i;
break;
}
}
listview.smoothScrollToPosition(POSITION);
}
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
});
答案 0 :(得分:0)
由于您有20,000个列表条目,因此每次用户更改文本时,您当前所执行的操作都会很慢,因为您最多可执行20,000 startsWith()
个操作。
那你能做什么:
最简单的解决方案:
用户输入时请勿选择条目。让他完成并单击一个搜索按钮,然后只对每个文本更改执行您当前所做的操作。
数据库解决方案:
如果您在数据库中有条目,请进行查询以获取该职位。这比在代码中搜索要快得多。如果你不这样做,你能把它放到数据库中吗?是否值得效果还是“最简单的解决方案”足够好?
尽量聪明:
您可以尝试在用户输入时收集信息,并将其用于您的优势。假设用户开始输入Hello
。输入H
后,您会找到以H
开头的第一个项目,例如位置1000.现在,当用户键入e
时,您不必从头开始,但可以从位置1000开始,依此类推。当然,当用户删除某个字符或粘贴另一个文本等时,您还必须处理这些情况,因此这里涉及一些编程逻辑。