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

【Android開発】SearchViewの使い方を解説!ListViewの検索・絞り込み機能を実装する手順

この記事では、AndroidアプリでSearchViewを使用して、ListViewに表示された項目をリアルタイムに検索・絞り込む方法を解説します。SearchViewを活用すれば、少ないコード量で直感的な検索機能をアプリに追加できます。

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

Android Studioを起動し、「File」→「New Project」を選択して新しいプロジェクトを作成します。必要な項目をすべて入力してプロジェクトをセットアップしてください。

ステップ2:レイアウトファイル(activity_main.xml)の編集

res/layout/activity_main.xmlに以下のコードを追加します。画面上部に検索ボックスを表示するSearchView、その下に項目一覧を表示するListViewをRelativeLayoutで配置しています。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
   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"
   tools:context=".MainActivity">
   <ListView
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:id="@+id/listView"
      android:divider="#ad5"
      android:dividerHeight="2dp"
      android:layout_below="@+id/searchView"/>
   <SearchView
      android:id="@+id/searchView"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:queryHint="Search Here"
      android:iconifiedByDefault="false"
      android:layout_alignParentTop="true"/>
</RelativeLayout>

ポイントは以下の属性です。

  • queryHint:検索ボックスに表示されるヒントテキストを設定します。
  • iconifiedByDefault:falseに設定すると、SearchViewが常に展開された状態で表示されます。

ステップ3:MainActivity.javaの実装

src/MainActivity.javaに以下のコードを追加します。このサンプルでは果物の名前リストをArrayAdapterでListViewに表示し、SearchViewに入力されたテキストに応じてリストを動的に絞り込みます。

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
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 {
   SearchView searchView;
   ListView listView;
   ArrayList list;
   ArrayAdapter adapter;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      searchView = findViewById(R.id.searchView);
      listView = findViewById(R.id.listView);
      list = new ArrayList<>();
      list.add("Apple");
      list.add("Banana");
      list.add("Pineapple");
      list.add("Orange");
      list.add("Mango");
      list.add("Grapes");
      list.add("Lemon");
      list.add("Melon");
      list.add("Watermelon");
      list.add("Papaya");
      adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,list);
      listView.setAdapter(adapter);
      searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
         @Override
         public boolean onQueryTextSubmit(String query) {
            if(list.contains(query)){
               adapter.getFilter().filter(query);
            }else{
               Toast.makeText(MainActivity.this, "No Match found",Toast.LENGTH_LONG).show();
            }
            return false;
         }
         @Override
         public boolean onQueryTextChange(String newText) {
            adapter.getFilter().filter(newText);
            return false;
         }
      });
   }
}

検索処理の仕組みは以下のとおりです。

  • onQueryTextChange():検索ボックスのテキストが変更されるたびに呼び出され、入力内容に合わせてリストをリアルタイムに絞り込みます。
  • onQueryTextSubmit():検索が確定(送信)されたときに呼び出されます。リストに該当項目がない場合は「No Match found」というToastメッセージを表示します。

リストの絞り込みには、ArrayAdapterが持つgetFilter().filter()メソッドを使用しています。

ステップ4:AndroidManifest.xmlの確認

androidManifest.xmlは以下のようになります。今回の機能では特別なパーミッションは不要です。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android" package="app.com.sample">
   <application
      android:allowBackup="true"
      android:icon="@mipmap/ic_launcher"
      android:label="@string/app_name"
      android:roundIcon="@mipmap/ic_launcher_round"
      android:supportsRtl="true"
      android:theme="@style/AppTheme">
      <activity android:name=".MainActivity">
         <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
         </intent-filter>
      </activity>
   </application>
</manifest>

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

それではアプリを実行してみましょう。Android端末をPCに接続した状態で、Android Studioのツールバーにある「Run」アイコンをクリックします。実行デバイスとして接続した端末を選択すると、以下のような画面が表示されます。

【Android開発】SearchViewの使い方を解説!ListViewの検索・絞り込み機能を実装する手順

【Android開発】SearchViewの使い方を解説!ListViewの検索・絞り込み機能を実装する手順

【Android開発】SearchViewの使い方を解説!ListViewの検索・絞り込み機能を実装する手順

まとめ

SearchViewとOnQueryTextListenerを組み合わせることで、入力テキストに応じてListViewの項目をリアルタイムに絞り込む検索機能を簡単に実装できます。連絡先リストや商品一覧など、データが多い画面に検索機能を追加したい場合にぜひ活用してみてください。

  1. 【Android】スナックバー(Snackbar)の使い方をステップごとに解説

    このチュートリアルでは、Androidアプリでスナックバー(Snackbar)を使用する方法を、サンプルコードとともに段階的に解説します。スナックバーは画面下部に短いメッセージを一時的に表示できるUIコンポーネントで、Toastとは異なり「再試行(RETRY)」などのアクションボタンを組み込めるのが大きな特徴です。 手順1:新規プロジェクトを作成する Android Studioを起動し、メニューから「File」→「New Project」を選択します。必要な項目をすべて入力して、新しいプロジェクトを作成しましょう。 手順2:レイアウトファイル(activity_main.xml)を編集する

  2. 【Android】NavigationViewの実装方法をステップごとに解説

    この記事では、AndroidアプリでNavigationView(ナビゲーションビュー)を使用してドロワーメニューを実装する方法を、ステップごとに詳しく解説します。ハンバーガーアイコンから開閉できるサイドメニューは、多くのアプリで採用されている定番のUIです。ステップ1:新しいプロジェクトを作成するAndroid Studioを開き、File → New Project を選択して、必要な情報を入力し新しいプロジェクトを作成します。テンプレートには「Navigation Drawer Activity」を選ぶと、後の作業がスムーズになります。ステップ2:activity_main.xml にコ