我必须在AutoCompleteTextView中加载大约5000个数据。如果我直接在适配器内加载所有数据,应用程序将挂起。
所以我刷新适配器,在更改的文本上匹配10个项目。但是对于每个文本更改仍然有轻微的hicup,因为它在每个charcter上查询db。
有没有更好的方法可以高效,快速地加载5000个数据? 。
buildFields();
AutoCompleteTextView field;
FilterableArrayAdapter typeAdapter;
public void buildFields() {
refreshFieldData(null);
field.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.d("log","selected");
}
});
field.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable arg0) {
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
}
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
String text = field.getText().toString().toLowerCase(Locale.getDefault());
if(text.length() == 0){
return;
}
refreshFieldData(text);
}
});
}
void refreshFieldData(String text){
List<type> list;
if (text != null)
list = db.getInfoMatchingStr(text); //Returns the matching 10 digits
else
list = db.getInfo(); // Returns 10 digits
typeAdapter = new FilterableArrayAdapter(getActivity(), android.R.layout.select_dialog_item);
typeAdapter.attachInfo(list);
field.setAdapter(typeAdapter);
typeAdapter.notifyDataSetChanged();
}
答案 0 :(得分:0)
将查询延迟500毫秒。
final static int query_msg=1
onTextChanged(){
if(mHandler.hasMessage(1)){
mHandler.removeMessage(1);
}
mHandler.sendDelayed(query_msg,500)
}
...
case query_msg:
//do query action.
答案 1 :(得分:0)
您是如何在数据库中存储单词的。为了提高效率,您可以根据字典结构存储单词,这样您就可以根据用户输入的第一个单词过滤结果。由于你一次使用十个单词,这应该会提高效率。