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

Android開発:LinkedHashSetを使ってArrayListの重複を削除しListViewに表示する方法

はじめに

この記事では、AndroidアプリのListViewにおいて、LinkedHashSetを活用してArrayListから重複データを取り除く方法を実例とともに解説します。ユーザーが入力した名前をArrayListに保存する際、すでに同じ値が存在する場合は自動的に除外される仕組みを実装していきます。

手順1:プロジェクトの新規作成

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

手順2:レイアウトファイル(activity_main.xml)の編集

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」の2つのボタン、さらにデータを一覧表示するListViewを縦方向に配置しています。「Save」ボタンをタップすると入力内容がArrayListに保存され、「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.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.LinkedHashSet;
public class MainActivity extends AppCompatActivity {
    Button save, refresh;
    EditText name;
    ArrayAdapter arrayAdapter;
    ArrayList<String>array_list;
    private ListView listView;
    @Override
    protected void onCreate(Bundle readdInstanceState) {
        super.onCreate(readdInstanceState);
        setContentView(R.layout.activity_main);
        array_list = new ArrayList<>();
        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()) {
                    array_list.add(name.getText().toString());
                    LinkedHashSet hs = new LinkedHashSet();
                    hs.addAll(array_list);
                    array_list.clear();
                    array_list.addAll(hs);
                    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");
                }
            }
        });
    }
}

重複削除の仕組み

このサンプルの核心となるのは、Saveボタンのクリック処理内にある次の部分です。

LinkedHashSetは「要素の挿入順序を保持しながら、重複する要素を許可しない」という特性を持つコレクションです。ArrayListの中身を一度LinkedHashSetに移し替えてから、再度ArrayListへ戻すことで、元の並び順を維持したまま重複要素だけを効率的に除去できます。また、入力欄が空の場合は setError() によってエラーメッセージを表示するバリデーションも実装されています。

アプリの実行方法

それではアプリを実行してみましょう。実際のAndroid端末をパソコンに接続しているものとします。Android Studioでプロジェクト内のアクティビティファイルを開き、ツールバーの「Run」アイコンをクリックしてください。接続済みのモバイルデバイスを選択すると、アプリが起動して初期画面が表示されます。

実行結果の確認

Android開発:LinkedHashSetを使ってArrayListの重複を削除しListViewに表示する方法

上記の実行結果では、同じ名前を何度か入力しています。そのたびに「Inserted」というToastメッセージは表示されますが、ArrayListには同じ名前が二重に登録されていないことがわかります。これはLinkedHashSetによる重複除去が正しく機能している証拠であり、ListViewにも重複のないリストが表示されます。

  1. 【Android】クリック操作でListViewのアイテムを動的に更新・削除する方法

    このチュートリアルでは、AndroidのListViewにおいて、アイテムをクリックした際にその内容を動的に更新・削除する方法を、サンプルコードとともにわかりやすく解説します。手順1:新規プロジェクトの作成Android Studioを起動し、メニューから「File」→「New Project」を選択して新しいプロジェクトを作成します。必要な項目をすべて入力し、プロジェクトのセットアップを完了させてください。手順2:レイアウトファイルの作成res/layout/activity_main.xml に以下のコードを記述します。<?xml version = "1.0"

  2. AndroidでListViewにカスタムアダプターを追加する方法を徹底解説

    この記事では、AndroidアプリのListViewにカスタムアダプター(BaseAdapter)を実装する方法を、サンプルプロジェクトのコードとともにステップ形式で解説します。リストの各行に「番号」「名前」「電話番号」を表示するシンプルな連絡先リストを作成しながら、カスタムアダプターの基本的な仕組みを学びましょう。カスタムアダプターとは?ListViewは、データの一覧をスクロール可能な形で表示するためのUIコンポーネントです。デフォルトの ArrayAdapter では単純なテキストしか表示できませんが、BaseAdapter を継承したカスタムアダプターを使えば、複数の TextView