2017-05-31 174 views
0

我必須在AutoCompleteTextView中加載大約5000個數據。如果我直接在適配器內部加載所有數據,應用程序將掛起。在Android 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

例如延遲查詢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. 
+0

不,這不會提高速度 – user3383301

0

你是如何在數據庫中存儲單詞的。爲了提高效率,您可以根據字典結構存儲單詞,這樣您可以根據用戶輸入的第一個單詞過濾結果。由於您一次使用十個字,這應該會提高效率。