有效地在android AutoCompleteTextView中加载巨大的数据(大约5000)

时间:2017-05-31 05:36:36

标签: android autocompletetextview

我必须在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();
}

2 个答案:

答案 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)

您是如何在数据库中存储单词的。为了提高效率,您可以根据字典结构存储单词,这样您就可以根据用户输入的第一个单词过滤结果。由于你一次使用十个单词,这应该会提高效率。