現在ListViewにSearchViewを加えてリアルタイムの検索機能を実装しています。
SearchViewの実装には成功したのですが、検索候補に少し不満があります。
リアルタイム処理してくれるのは良いのですが、デフォルトでは入力文字列を先頭に含む文字列群しか候補に表示してくれません。
"abcde", "cdeab" という文字列要素があり、入力が"ab"だったら"abcde"の方しか表示してくれないのです。
僕は上の例で言うと"ab"や"c"と入力したらどちらも表示してくれる動作が欲しいのです。
説明下手で申し訳御座いません。何か良い方法があればご教授ください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
ListViewのフィルタリングは、(ArrayAdapterを使用していると思いますが、)Adapterクラスが持っているFilterが行っています。(ArrayAdapterならprivateなArrayFilter。これは前方一致のロジックになっています。)
従って、ArrayAdapterを継承し、望みのフィルタリングを行うFilterクラスを実装することになります。
ArrayAdapterのソースファイルがあるなら、それを参考にしていただいた方が良いと思いますが、とりあえず動いたサンプルを上げておきます。(このサンプルは大文字小文字を区別します。)
あと、サンプルを作成する上ではまったところがありますので、参考になるサイトも上げておきます。
ArrayAdapter使ったらなぜかUnSupportedOperationExceptionで落ちる
(略)のコンストラクタではmObjectsをArrays.asList()で生成しているのですが、Arrays.asList()で生成されるオブジェクトはArraysクラスのインナークラスArrayList(注:java.util.ArrayListではない)で、このArrayListクラスにはadd,removeなどが実装されていない(略)
java
1public class TestAdapter extends ArrayAdapter<String> { 2 3 private TestFilter _filter; 4 private List<String> initialEntry; 5 6 public TestAdapter(Context context, int resource, String[] objects) { 7 super(context, resource, new ArrayList<String>(Arrays.asList(objects))); 8 initialEntry = Arrays.asList(objects); 9 } 10 11 @Override 12 public Filter getFilter() { 13 if(_filter == null) { 14 _filter = new TestFilter(); 15 } 16 return _filter; 17 } 18 19 public class TestFilter extends Filter { 20 21 @Override 22 protected FilterResults performFiltering(CharSequence constraint) { 23 ArrayList<String> items = new ArrayList<>(); 24 25 if (constraint == null || constraint.length() == 0) { 26 items = new ArrayList<String>(initialEntry); 27 } else { 28 // getCount及びgetItemはAdapterのメソッド 29 for(int i = 0, size = getCount(); i < size; i++) { 30 String data = getItem(i); 31 if(data.contains(constraint)) { 32 items.add(data); 33 } 34 } 35 } 36 FilterResults r = new FilterResults(); 37 r.count = items.size(); 38 r.values = items; 39 return r; 40 } 41 42 @SuppressWarnings("unchecked") 43 @Override 44 protected void publishResults(CharSequence constraint, Filter.FilterResults results) { 45 46 // Adapterのメソッドでデータの内容を更新する 47 if(results != null && results.count > 0) { 48 49 List<String> items = (List<String>) results.values; 50 clear(); 51 addAll(items); 52 53 notifyDataSetChanged(); 54 } else { 55 notifyDataSetInvalidated(); 56 } 57 } 58 } 59}
投稿2016/09/08 04:57
総合スコア1682
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/09/11 06:36