編集テキストにユーザーが入力した検索文字列で電話の連絡先をフィルタリングする際に問題が発生します。
うまくフィルタリングされているように見えますが、問題は、フィルタリングされたListViewにALLCONTACTSListViewと同じ初期連絡先が含まれていることです。
例えば:
ALL CONTACTS:
A - B - C - D - E
にEを記述しEditText
、を使用してTextWatcher
、フィルター処理された結果はA
です。
つまり、フィルタリングは適切に行われているようですが(1つの結果のみ)、リストビューのコンテンツは更新されていません。
ここにいくつかのコード:
getFilter()
およびカスタムフィルター:
@Override
public Filter getFilter()
{
if (mFilter == null)
{
mFilter = new CustomFilter();
}
return mFilter;
}
private class CustomFilter extends Filter
{
@Override
protected FilterResults performFiltering(CharSequence prefix)
{
FilterResults results = new FilterResults();
Log.d("PREFIX", "its ---> " + prefix);
prefix = prefix.toString().toLowerCase();
if(prefix != null && prefix.length()>0)
{
ArrayList<Contact> contatti = new ArrayList<Contact>();
for(int i = 0; i < _app._contacts.size(); i++)
{
Contact current = _app._contacts.get(i);
if(current.getContactName().toLowerCase(Locale.getDefault()).contains(prefix) /*|| current.getNumber().toLowerCase().contains(prefix)
|| current.getEmail().toLowerCase().contains(prefix) || current.getOrganization().toLowerCase().contains(prefix)*/)
{
contatti.add(current);
Log.d("added to contatti list: ", current.getContactName()+" - "+current.getNumber());
}
}
results.count = contatti.size();
results.values = contatti;
}
else
{
results.count = _app._contacts.size();
results.values = _app._contacts;
}
return results;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results)
{
ArrayList<Contact> risultatoFiltro = new ArrayList<Contact>();
risultatoFiltro = (ArrayList<Contact>) results.values;
MyAdapter filteredAdapter = new MyAdapter(_ctx,R.layout.listview,risultatoFiltro);
MainActivity.lv.setAdapter(filteredAdapter);
notifyDataSetChanged();
}
}
編集
編集されたpublishResultsメソッド:
protected void publishResults(CharSequence constraint, FilterResults results)
{
if (results.count == 0)
notifyDataSetInvalidated();
else
{
ArrayList<Contact> risultatoFiltro = (ArrayList<Contact>) results.values;
notifyDataSetChanged();
clear();
//Add the items back in
for (Iterator<Contact> iterator = risultatoFiltro.iterator(); iterator.hasNext();)
{
Contact contactList = (Contact) iterator.next();
add(contactList);
}
}
}
これでフィルタリングはうまく機能しますが、一部の文字を削除してもリストが更新されません。
例:「ダニエル」と書きます。「D」以外のすべてを削除すると、リストは「ダニエル」のままになります。また、「D」を削除すると、リストは最初のリストではありませんが、空のリストが表示されます。
これを理解するのを手伝ってくれませんか。