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

AndroidでunmodifiableSet(変更不可のSet)を使用する方法を解説

この記事では、Androidアプリ開発においてunmodifiableSet(変更不可能なSet)を使用する方法を、実際のサンプルコードを交えながらわかりやすく解説します。

unmodifiableSetとは

java.util.Collections.unmodifiableSet()は、指定したSetオブジェクトの変更不可能なビューを返すメソッドです。このメソッドで生成されたSetに対して要素の追加や削除を試みると、UnsupportedOperationExceptionがスローされます。これにより、内部データを外部から意図せず変更されることを防ぐことができます。

実装手順

ステップ1:新規プロジェクトを作成する

Android Studioを起動し、「File」→「New Project」を選択して、必要な情報を入力して新しいプロジェクトを作成します。

ステップ2:レイアウトファイルにコードを追加する

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

<?xml version = "1.0" encoding = "utf-8"?>
<LinearLayout 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"
    android:orientation = "vertical">
    <EditText
        android:id = "@+id/name"
        android:layout_width = "match_parent"
        android:hint = "Enter Name"
        android:layout_height = "wrap_content" />
    <LinearLayout
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content">
        <Button
            android:id = "@+id/save"
            android:text = "Save"
            android:layout_width = "wrap_content"
            android:layout_height = "wrap_content" />
        <Button
            android:id = "@+id/refresh"
            android:text = "Refresh"
            android:layout_width = "wrap_content"
            android:layout_height = "wrap_content" />
    </LinearLayout>
    <ListView
        android:id = "@+id/listView"
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content">
    </ListView>
</LinearLayout>

上記のレイアウトでは、名前を入力するためのEditText、データを保存する「Save」ボタン、リストを更新する「Refresh」ボタン、そして登録済みの項目を一覧表示するListViewを配置しています。

ステップ3:MainActivity.javaにコードを追加する

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

package com.example.andy.myapplication;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import java.util.Collections;
import java.util.Set;
import java.util.ArrayList;
import java.util.SortedSet;
import java.util.TreeSet;
public class MainActivity extends AppCompatActivity {
    EditText name;
    ArrayAdapter arrayAdapter;
    ArrayList<String> array_list;
    SortedSet set = new TreeSet();
    private ListView listView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        array_list = new ArrayList<String>();
        name = findViewById(R.id.name);
        listView = findViewById(R.id.listView);
        findViewById(R.id.refresh).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                arrayAdapter.notifyDataSetChanged();
                listView.invalidateViews();
                listView.refreshDrawableState();
            }
        });
        findViewById(R.id.save).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (!name.getText().toString().isEmpty()) {
                    set.add(name.getText().toString());
                    Set syncSet = Collections.unmodifiableSet(set);
                    array_list.clear();
                    array_list.addAll(syncSet);
                    arrayAdapter = new ArrayAdapter(MainActivity.this, android.R.layout.simple_list_item_1, array_list);
                    listView.setAdapter(arrayAdapter);
                    Toast.makeText(MainActivity.this, "Inserted", Toast.LENGTH_LONG).show();
                } else {
                    name.setError("Enter NAME");
                }
            }
        });
    }
}

コードのポイント

このサンプルでは、ユーザーが入力した名前をTreeSetに格納しています。TreeSetは要素を自動的にソートし、重複を許さないという特徴を持つため、名簿のようなデータの管理に適しています。

「Save」ボタンがタップされると、次の流れで処理が実行されます。

  • 入力欄が空でないかチェックし、空の場合はエラーを表示する
  • 入力値をTreeSetに追加する
  • Collections.unmodifiableSet(set)を呼び出して、変更不可能なSetのビューを取得する
  • その内容をArrayListにコピーし、ArrayAdapterを通じてListViewに反映させる
  • 「Inserted」というトーストメッセージを表示する

重要なのは、unmodifiableSetで得られるsyncSetはあくまでも元のSetのビューだという点です。元のset自体は依然として変更可能ですが、syncSet経由で行われるすべての変更操作は禁止されます。これにより、安全にデータを読み取る専用の参照として活用できます。

アプリを実行する

Android端末をPCに接続した状態で、Android Studioのツールバーにある実行(Run)アイコンをクリックします。デバイスを選択してアプリを起動しましょう。

AndroidでunmodifiableSet(変更不可のSet)を使用する方法を解説

実行結果の確認

上記の実行結果では、名前を入力して「Save」ボタンをタップするたびに、TreeSetの要素がソートされた状態でアダプターを通じてListViewに表示されていることが確認できます。Refreshボタンを押せば、リストの表示を最新の状態に更新することも可能です。

  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 にコ