Android中修改原始碼實現AutoCompeteTextView控制元件的模糊匹配
最近在做Android開發,使用其控制元件AutoCompleteTextView時發現只能實現字首匹配,也就是說只能匹配以所輸入的字元開始的資料,覺得google這個做的不好,不夠人性化。要是資料非常多,而又確實不記得所要找的資料以什麼字元開始的,那該怎麼辦呢?哈哈,作為中國共產黨領導下的共產主義下的和諧社會下的偉大而又苦X的程式猿,這小小的問題怎麼能難得住我們。
大家知道,Android系統是開源的,也就是說我們可以通過修改其原始碼來解決這個問題。
先看截圖:
上圖中左邊是AutoCompeteTextView控制元件字首匹配結果,右邊的是通過修改其原始碼實現其中綴和字尾匹配。
接下來說下怎麼修改Android原始碼,當然要想修改其原始碼,必須要下載Android原始碼,建議有條件的童鞋們使用Git工具自己下載,因為Android系統一直在更新,其原始碼也在不斷地更改。懶蟲們可以從博文結尾的連結中下載。
首先在android\widget的目錄下找到ArrayAdapter.java檔案並開啟,下面是部分原始碼:
private class ArrayFilter extends Filter {
@Override
protected FilterResults <span style="color:#ff0000;">performFiltering(CharSequence prefix)</span> {
FilterResults results = new FilterResults();
if (mOriginalValues == null) {
synchronized (mLock) {
mOriginalValues = new ArrayList<T>(mObjects);
}
}
if (prefix == null || prefix.length() == 0) {
synchronized (mLock) {
ArrayList<T> list = new ArrayList<T>(mOriginalValues);
results.values = list;
results.count = list.size();
}
} else {
String prefixString = prefix.toString().toLowerCase();
final ArrayList<T> values = mOriginalValues;
final int count = values.size();
final ArrayList<T> newValues = new ArrayList<T>(count);
for (int i = 0; i < count; i++) {
final T value = values.get(i);
final String valueText = value.toString().toLowerCase();
// First match against the whole, non-splitted value
if (valueText.startsWith(prefixString)) {
newValues.add(value);
} else {
final String[] words = valueText.split(" ");
final int wordCount = words.length;
for (int k = 0; k < wordCount; k++) {
<span style="color:#ff0000;"> if (words[k].startsWith(prefixString)) {</span>
newValues.add(value);
break;
}
}
}
}
results.values = newValues;
results.count = newValues.size();
}
return results;
}
找到”if (words[k].startsWith(prefixString)) {“這行,將其改為“if (words[k].indexOf(prefixString)!=-1) {”便可。還需將ArrayAdapter所屬的包改為自己的包。如果以後還會用到,建議將其打包為.jar檔案。
專案目錄結構如下:
public class AutoCompleteTextViewActivity extends Activity {
/** Called when the activity is first created. */
private AutoCompleteTextView actv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
String[] s=new String[]{"aaaa","abcd","bbac","dbca"};
actv=(AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1);
//系統預設為字首匹配
//android.widget.ArrayAdapter<String> adapter=new android.widget.ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line,s);
//通過修改android原始碼實現中綴和字尾匹配
com.zhang.autocomplete.ArrayAdapter<String> adapter=new com.zhang.autocomplete.ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line,s);
//Specifies the minimum number of characters the user has to type in the edit box before the drop down list is shown.
//setThreshold的引數也就是說要實現匹配所應輸入的最小字元數,這裡為1,指只要輸入一個字元便開始匹配,為2則需輸入2個字元才開始匹配,以此類推
actv.setThreshold(1);
actv.setAdapter(adapter);
}
}
只要注意這裡的ArrayAdapter使用的是自己修改的,前面加上包名以示區別。
專案原始碼下載:http://download.csdn.net/detail/zhang957411207/4416554
Android2.2原始碼下載:http://download.csdn.net/detail/zhang957411207/4416564
相關文章
- UE 不修改原始碼實現遮罩控制元件 (Mask Widget)原始碼遮罩控制元件
- 如何在 Excel 外掛 PowerPivot 中實現詞根模糊匹配Excel
- 正規表示式實現字元的模糊匹配功能示例字元
- mongo的‘模糊匹配’Go
- Android實現快速高斯模糊Android
- 使用cstring實現中文字串模糊匹配字串
- 讀書APP原始碼,搜尋欄模糊處理實現APP原始碼
- Android中實現類似iOS的SwitchButton控制元件AndroidiOS控制元件
- iOS中實現模糊效果教程iOS
- 編寫簡易的JS輸入框模糊查詢匹配(附有原始碼和demo)JS原始碼
- 原始碼解析.Net中DependencyInjection的實現原始碼
- Go 中的鎖原始碼實現:MutexGo原始碼Mutex
- Android影象處理 - 高斯模糊的原理及實現Android
- redis scan迭代模糊匹配Redis
- 如何使用QCompleter和QLineEdit實現支援模糊匹配的搜尋欄
- 原始碼解析.Net中Middleware的實現原始碼
- Lru在Rust中的實現, 原始碼解析Rust原始碼
- 單例模式的幾種實現與在Android原始碼中的應用單例模式Android原始碼
- Android中AIDL實現程式通訊(附原始碼下載)AndroidAI原始碼
- Android OTA功能的實現和修改Android
- Android Studio中Spinner控制元件的資料繫結實現Android控制元件
- 短視訊原始碼,在Android 中opengl es實現燈光效果原始碼Android
- JDK中的BitMap實現之BitSet原始碼分析JDK原始碼
- 在Golang中實現Actor模型的原始碼 - GauravGolang模型原始碼
- 看原始碼1. ArrayList中的Iterator實現原始碼
- Android 原始碼中的命令模式Android原始碼模式
- app直播原始碼,平臺登入頁面實現和修改密碼頁面實現APP原始碼密碼
- musl中strlen原始碼實現和分析原始碼
- app直播原始碼,android AES加密解密實現APP原始碼Android加密解密
- WPF實現html中的table控制元件HTML控制元件
- 如何“修改”底層框架原始碼中的某些功能框架原始碼
- Netty 原始碼中對 Redis 協議的實現Netty原始碼Redis協議
- Android 原始碼分析 --Handler 機制的實現與工作原理Android原始碼
- Android 原始碼中的編譯命令Android原始碼編譯
- 實現Exchange 2003 OWA中修改密碼密碼
- vlc-android最新原始碼截圖功能實現Android原始碼
- 在程式碼中實現android:tint效果Android
- Android中IntentService原始碼分析AndroidIntent原始碼