2014-01-10 54 views
0

在很多地方我看到了不同的自動完成方式,其中一些我認爲非常基本,另一些很好地實現。自定義AutoCompleteTextView的自動完成規則

我的想法是有一個AutoCompleteTextView但定製其自動完成的方式。例如,我的所有自動完成建議都是單行字符串,空格用短劃線( - )代替。如果我有類似last-night-I-was-bad的建議,我的目標是如果用戶輸入任何單詞的首字母(我的意思是:l,n,I,wb),則會顯示該建議。總結:將短劃線作爲空格並顯示與任何「單詞」的任何子字符串匹配的建議。這種自動完成我認爲非常有用!

我也有興趣放棄一些建議中的字符。例如,假設我的所有自動建議以@開頭,並且用戶輸入a字母,則將顯示以@a開頭的所有建議。

是否有這樣的事情,或者至少是否有可能自定義AutoCompleteTextView處理建議的方式?我查看了文檔,但沒有看到類似的東西(或者至少不是直接的)。

任何幫助表示讚賞!

回答

1

最後我明白了。我做了一個ArrayAdapter擴展,它有一個內部Filter擴展名,並且覆蓋了performFiltering(CharSequence)publishResults(CharSequence, FilterResults)我能夠實現我需要的行爲(基本上比較兩個String s使用而不是默認startsWith())。

代碼會是這樣的,希望它可以幫助某人。

public class SubstringFilterArrayAdapter<T> extends ArrayAdapter<T> implements Filterable { 
    // Needed data structures 
    ... 
    final List<T> objects; 
    final CustomFilter myfilter = new CustomFilter(); 
    ... 

    public SubstringFilterArrayAdapter(final Context context_, final int tvResId_, final List<T> objects_) { 
    objects = objects_; 
    ... 
    } 

    @Override 
    public Filter getFilter() { 
    ... 
    } 

    private class CustomFilter extends Filter { 
    @Override 
    protected FilterResults performFiltering(final CharSequence prefix) { 
     final FilterResults results = new FilterResults(); 
     final ArrayList<T> matched = new ArrayList<T>(); 


     // Put in matched the results that match the prefix using your own implementation 
     ... 

     results.values = matched; 
     results.count = matched.size(); 

     return results; 
    } 

    @Override 
    protected void publishResults(final CharSequence constraint, final FilterResults results) { 
     objects = (List<T>) results.values; 

     if (results.count > 0) 
     notifyDataSetChanged(); 
     else 
     notifyDataSetInvalidated(); 
    } 
    } 

    @Override 
    public int getCount() { 
    return objects.size(); 
    } 

    @Override 
    public T getItem(int position) { 
    return objects.get(position); 
    } 
}