質問: 初めて質問させていただきます。よろしくお願いいたします。 ### 前提・実現したいこと 1行に6個のテキストを持つListViewに検索機能を追加したいです。 6個のテキストそれぞれに対して部分一致検索を行い、一つでも部分一致するものがあれば その行を表示したいと思っています。 ### 発生している問題・エラーメッセージ 1行に1個のテキストを含むListViewの検索機能について、調べたところ多くの回答がありました。 しかし、複数のテキストを含む場合どうすればいいのか分かりません。 参考までに以下が私の見解です ほかの回答では list.setFilterText(~~); のメソッドで文字列を渡しているように感じました。 なのでsetFilterTextをオーバーライドし、6個のテキストを同時に検索にかけれるのではないかと感じました。しかし実装の仕方も戻り値も全く分かりませんしどうすればいいか分からないです。 完全に独学で勉強していたので、知識の前提からいろいろ間違っているかもしれないのでご指摘いただけると嬉しいです。よろしくお願いいたします。 <補足> ・ArrayAdapterを継承したCustomArrayAdapterを使用しています
回答: 最近はもっぱらRecyclerViewを使っていてListViewはしばらく触っていないのですが、どちらでも使える方法を回答します。setFilterTextを使うのも一つの方法ではありますが、こちらの方が一般的で応用が効くと思います。(例えば、アイテムを後から追加・削除したいときなど) 手順としては、 * 元のデータにフィルターをかけたリストを用意する * ArrayAdapterにリストを渡して、更新する これだけです。 実装例としては以下のような感じになります。 ``` // Adapterの作成時 // 6個のテキストを持つデータのリスト List items = ... CustomArrayAdapter adapter = ... ... // 検索ボタン押下時の処理 @Override public boolean onSubmitQuery(String query) { // 元のデータにフィルターをかけたリストを作成 final List filteredItems = new ArrayList(); for (String[] item: items) { for (String text: item) { if (text.contains(query)) { // テキストがqueryを含めば検索にHITさせる filteredItems.add(item); } } } // adapterの更新処理 adapter.clear(); adapter.addAll(filteredItems); adapter.notifyDataSetChanged(); } ```