[英]Filter arraylist in java/android
您好我需要篩選ArrayList
我有一個包含以下各項的ArrayList :
“你好世界”“你好男人”“你好女人”“再見世界”“再見男人”“再見女人”
然后在TextBox上添加了一個textchanged偵聽器(Android)。我想要的是,如果我用空格隔開寫“ he wo”,則顯示“ Hello world”和“ Hello woman”。
我已經為此奮斗了大約一個小時,只有我得到的是,如果我寫“ he wo”,我會得到以下項目: “ Hello world”,“ Hello man”,“ Hello woman”,“ Goodbye world” 。 這是代碼
et.addTextChangedListener(new TextWatcher()
{
public void afterTextChanged(Editable s)
{
// Abstract Method of TextWatcher Interface.
}
public void beforeTextChanged(CharSequence s,
int start, int count, int after)
{
// Abstract Method of TextWatcher Interface.
}
public void onTextChanged(CharSequence s, int start, int before, int count)
{
//listabusClientes = new ArrayList<busCliente>();
paraulesBuscar = s.toString().split(" "); //Array of string
sortarray = new ArrayList<busCliente>(); //ArrayList of class busCliente
sortarray.clear();
for(int x = 0; x < paraulesBuscar.length; x++){
sortarray.clear();
for (int i = 0; i < listabusClientes.size(); i++)
{
if ((listabusClientes.get(i).getNom().toUpperCase().indexOf(paraulesBuscar[x].toUpperCase()) != -1) || (listabusClientes.get(i).getCodiClient().toUpperCase().indexOf(paraulesBuscar[x].toUpperCase()) != -1))
{
sortarray.add(listabusClientes.get(i));
}
}
}
lv.setAdapter(new ListViewAdapter(buscar_client.this,
R.layout.simple_list_item_1, sortarray));
}
});
編輯算法
paraulesBuscar = s.toString().split(" ");
sortarray = new ArrayList<busCliente>();
sortarray.clear();
for(int x = 0; x < paraulesBuscar.length; x++){
sortarray.clear();
for (int i = 0; i < listabusClientes.size(); i++)
{
String[] clientSplit = listabusClientes.get(i).getNom().split(" ");
for(int cs = 0; cs < clientSplit.length; cs++){
System.out.println(clientSplit[cs]);
if (clientSplit[cs].toUpperCase().contains(paraulesBuscar[x].toUpperCase()))
{
sortarray.add(listabusClientes.get(i));
}
}
}
}
這是我的做法:
String.split()
將“ he wo”分解為單詞,以獲得前綴數組["he", "wo"]
["Hello", "World"]
這應該使您入門。 確保將此算法實現為單獨的方法,其本身又分解為只做一件事的子方法。
編輯:
這是算法的最后一部分(步驟3和4):
/**
* Tells if every prefix has a corresponding word and if every word, lower-cased,
* starts with the corresponding prefix.
*/
private boolean allPrefixesMatch(String[] prefixes, String[] words) {
if (words.length < prefixes.length) {
return false;
}
for (int i = 0; i < prefixes.length; i++) {
String prefix = prefixes[i];
String word = words[i];
if (!word.toLowerCase().startsWith(prefix)) {
return false;
}
}
return true;
}
我建議您使用其他方法來解決此問題。 創建一個擴展ArrayAdapter並實現可過濾接口的自定義適配器。
在您的適配器中,創建一個擴展Filter的私有類。 您必須重寫兩個方法:
protected FilterResults performFiltering(CharSequence constraint) {.. }
和
protected void publishResults(CharSequence constraint,
FilterResults results) {..}
在第一個設置過濾規則的情況下,可以驗證項目中是否包含字符串。 在第二種方法中,您將發布過濾后的結果,並調用notifyDataSetChanged();。
您正確添加了一個changeTextListener,但是在onTextChanged中調用了過濾器以執行過濾操作:
aAdpt.getFilter().filter(s.toString());
其中aAdpt是您的自定義適配器。 我希望我很清楚。 如果您有任何疑問,可以在這里參考我的帖子。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.