SimpleCursorAdapter を使用する ListView に Filter を実装する方法について、複数の人が問題を抱えています。私はこの問題を抱えており、この Web でこれに関する多くの回答を見つけました。最終的に機能するようになるまで、どこからでもコードを取得しましたが、見た目はより単純でした。
YouTube で Google I/O 2010 - The world of ListView ビデオを見たことがありますが、getFilter メソッドを実装し、クラス アダプターに Filterable を実装する必要があると書かれています。
public class MyListCursorAdapter extends SimpleCursorAdapter implements Filterable{
...
@Override
public Filter getFilter() {
return new Filter(){
@Override
protected FilterResults performFiltering(CharSequence charSequence){
FilterResults results = new FilterResults();
//If there's nothing to filter on, return the original data for your list
if(charSequence == null || charSequence.length() == 0){
results.values = originalData;
results.count = originalData.getCount();
}
else{
Cursor filterResultsData = null;
filterResultsData = DB.getResults(charSequence);
results.values = filterResultsData;
results.count = filterResultsData.getCount();
}
return results;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults){
filteredData = (Cursor) filterResults.values;
if (filterResults.count > 0) {
notifyDataSetChanged();
}else{
notifyDataSetInvalidated();
}
}
};
}
}
少なくとも私がやろうとしたことです。Cursor の代わりに ArrayAdapter を使用すると、かなりうまく機能することがわかりました。しかし、Cursor の場合、少なくとも私にとってはうまくいきませんでした。多分私は何か間違ったことをしています。だから、どうしようかと少し戸惑いました。編集テキスト、リスト ビューがあり、編集テキストにテキストを入力するたびに、リストをフィルター処理する必要があることを知っています。
私の解決策をあなたと共有したいので、ここで私自身の質問に答えます。