Android
 Computer >> コンピューター >  >> プログラミング >> Android

AndroidのSearchView(検索ビュー)とは?リストを絞り込む検索機能の実装方法を解説


Androidアプリに検索機能を組み込みたいと思ったことはありませんか?SearchView(検索ビュー)は、HTMLでいうところの検索ボックスに相当するウィジェットです。SearchViewを使うことで、リストに表示されている項目をキーワードで簡単に絞り込むことができます。

この記事では、AndroidアプリにSearchViewを統合し、ListViewの項目をリアルタイムにフィルタリングする方法を、実際のサンプルコードとともにステップ形式で解説します。

実装手順

ステップ1:プロジェクトの作成

Android Studioで新しいプロジェクトを作成します。メニューから「File」→「New Project」を選択し、必要な項目をすべて入力してプロジェクトを作成しましょう。

ステップ2:レイアウトファイルの作成

res/layout/activity_main.xml に以下のコードを追加します。

<?xml version = "1.0" encoding = "utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android = "https://schemas.android.com/apk/res/android" xmlns:tools = "https://schemas.android.com/tools" android:layout_width = "match_parent" android:layout_height = "match_parent">
<LinearLayout
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    android:orientation = "vertical">
    <android.support.v7.widget.SearchView
        android:id = "@+id/search"
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content" />
    <ListView
        android:id = "@+id/list"
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content"/>
</LinearLayout>
</android.support.constraint.ConstraintLayout>

上記のコードでは、SearchViewとListViewを垂直方向に配置したLinearLayoutを定義しています。SearchViewに入力したキーワードで、ListViewの項目を検索・絞り込む構成になっています。

ステップ3:MainActivityの実装

src/MainActivity.java に以下のコードを追加します。

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.Toast;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final ListView list = findViewById(R.id.list);
        SearchView search = findViewById(R.id.search);
        search.setActivated(true);
        search.setQueryHint("Type your keyword here");
        search.onActionViewExpanded();
        search.setIconified(false);
        ArrayList<String> arrayList = new ArrayList<>();
        arrayList.add("JAVA");
        arrayList.add("ANDROID");
        arrayList.add("C Language");
        arrayList.add("CPP Language");
        arrayList.add("Go Language");
        arrayList.add("AVN SYSTEMS");
        final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, arrayList);
        list.setAdapter(arrayAdapter);
        search.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }
            @Override
            public boolean onQueryTextChange(String newText) {
                arrayAdapter.getFilter().filter(newText);
                return false;
            }
        });
        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String clickedItem = (String) list.getItemAtPosition(position);
                Toast.makeText(MainActivity.this, clickedItem, Toast.LENGTH_LONG).show();
            }
        });
    }
}

OnQueryTextListenerの2つのメソッド

上記のSearchViewでは、setOnQueryTextListener() というリスナーを設定しています。これはテキストの変化を監視するためのもので、次の2つのメソッドを持っています。

  • onQueryTextSubmit(String query):SearchViewでテキストが確定(送信)された後に呼び出されるメソッドです。入力された文字列を使って何らかの処理を行いたい場合は、ここに実装します。

  • onQueryTextChange(String newText):SearchViewに入力するたび、つまりテキストが変更されるたびに呼び出されるメソッドです。入力中にリアルタイムでアクションを実行したい場合に使用します。

今回のサンプルコードでは、クエリが変更されるたびに以下のようにフィルタを適用し、リストの表示を動的に絞り込んでいます。

@Override
public boolean onQueryTextChange(String newText) {
    arrayAdapter.getFilter().filter(newText);
    return false;
}

アプリを実行して動作を確認しよう

それでは、アプリケーションを実行してみましょう。実機のAndroidスマートフォンをパソコンに接続しているものとして説明を進めます。Android Studioでプロジェクト内のアクティビティファイルを開き、ツールバーにある実行アイコン AndroidのSearchView(検索ビュー)とは?リストを絞り込む検索機能の実装方法を解説 をクリックしてください。ドロップダウンから自分のモバイル端末を選択すると、端末側にアプリの初期画面が表示されます。

AndroidのSearchView(検索ビュー)とは?リストを絞り込む検索機能の実装方法を解説

続いて、ListViewの項目名に近いキーワードをSearchViewに入力してみてください。下の画像のように、入力した文字列に一致する項目だけが残り、リストが自動的に絞り込まれます。

AndroidのSearchView(検索ビュー)とは?リストを絞り込む検索機能の実装方法を解説

補足:AndroidXへの対応について

本記事のサンプルコードは旧式のandroid.supportライブラリを使用していますが、現在のAndroid開発ではAndroidXライブラリの利用が推奨されています。新規プロジェクトの場合は、android.support.v7.widget.SearchViewをandroidx.appcompat.widget.SearchViewに、AppCompatActivityもandroidx.appcompat.app.AppCompatActivityに置き換えて実装するとよいでしょう。基本的な実装の流れは同じです。


  1. ストックAndroidとは?「バニラAndroid」の特徴とメリットを徹底解説

    ストックAndroidは「バニラAndroid」とも呼ばれ、Android OSの中で最もシンプルな基本バージョンを指します。Googleが設計・開発したAndroidのコアをそのまま搭載しており、最大の特徴は、キャリア(通信事業者)が独自にプリインストールするアプリが含まれていない点です。例えば、Verizonの回線で使うストックAndroid端末には、Verizon製のアプリは入っていません。多くのユーザーにとって、こうした不要なアプリ(ブロートウェア)が存在しないことは大きな魅力であり、端末を自分の思い通りにコントロールする自由を取り戻せるのです。 また、ストックAndroidは、端末

  2. Android System WebView(ASW)とは?役割と更新方法を徹底解説

    Android端末のアプリ一覧や、Google Playストアのアップデート通知で「Android System WebView(AndroidシステムWebView)」という名前を目にしたことがあるかもしれません。この重要なシステムアプリは、ユーザーが直接インストールしたり操作したりするものではありませんが、Android OSにとって欠かせない存在です。 お使いのAndroidのバージョンによって、Android System WebViewはさまざまな形で提供されています。どの端末でも、ASW(またはその派生版)を有効かつ最新の状態に保つ必要があります。本記事では、その理由と、このシス