AndroidでTreeMapからArrayListへデータを削除しListViewに反映する方法
この記事では、AndroidアプリにおいてTreeMapに格納したデータを削除し、その結果をArrayList経由でListViewに表示・反映する方法を解説します。
作成するアプリの概要
今回は、名前とレコード番号を入力してデータを保存(Save)・一覧の再描画(Refresh)・指定したレコードの削除(Delete)が行えるシンプルなアプリを作成します。データはTreeMapで管理し、キー(レコード番号)順にソートされた状態でArrayListに変換してListViewへ表示します。
ステップ1:新規プロジェクトの作成
Android Studioを起動し、「File」⇒「New Project」を選択して新しいプロジェクトを作成します。必要な項目をすべて入力してプロジェクトをセットアップしてください。
ステップ2:レイアウトファイル(res/layout/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/record"
android:layout_width="match_parent"
android:hint="record number"
android:inputType="number"
android:layout_height="wrap_content" />
<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" />
<Button
android:id="@+id/delete"
android:text="Delete"
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>上記のレイアウトでは、名前とレコード番号を入力するための2つのEditText、「Save」「Refresh」「Delete」の3つのボタン、そしてデータを一覧表示するListViewを配置しています。ユーザーがSaveボタンをタップするとデータがArrayListに保存され、レコード番号を指定してDeleteボタンをタップすると、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.Map;
import java.util.TreeMap;
public class MainActivity extends AppCompatActivity {
Button save, refresh;
EditText name, record;
ArrayAdapter arrayAdapter;
ArrayList<String> array_list;
Map map = new TreeMap();
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
array_list = new ArrayList<>();
name = findViewById(R.id.name);
record = findViewById(R.id.record);
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.delete).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(!record.getText().toString().isEmpty()) {
map.remove(record.getText().toString());
array_list.clear();
array_list.addAll(map.values());
arrayAdapter = new ArrayAdapter(MainActivity.this, android.R.layout.simple_list_item_1, array_list);
listView.setAdapter(arrayAdapter);
Toast.makeText(MainActivity.this, "Deleted", Toast.LENGTH_LONG).show();
}
}
});
findViewById(R.id.save).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!name.getText().toString().isEmpty() && !record.getText().toString().isEmpty()) {
map.put(record.getText().toString(), name.getText().toString());
array_list.clear();
array_list.addAll(map.values());
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");
record.setError("Enter Record");
}
}
});
}
}コードのポイント
- データは
Map map = new TreeMap();として管理され、TreeMapの特性によりキー(レコード番号)の順序で自動的にソートされます。 - 保存時は
map.put()でデータを登録し、array_list.addAll(map.values())で値をArrayListにコピーしてからArrayAdapterにセットすることで、ListViewに最新の一覧を反映します。 - 削除時は
map.remove(レコード番号)で該当エントリを取り除いた後、保存時と同じ手順でArrayListを再構築し、ListViewを更新します。
動作確認
それではアプリを実行してみましょう。実機のAndroidスマートフォンをパソコンに接続しているものとします。Android Studioでプロジェクトのアクティビティファイルを開き、ツールバーの「Run」アイコンをクリックしてください。デバイスを選択して実行すると、端末に次のような初期画面が表示されます。

上記の結果では、2件のレコードが挿入された状態になっています。

次に、レコード番号に「2」を入力して「Delete」ボタンをタップします。すると、下の画像のようにListViewから該当するレコードが削除されます。
-
【Android】ListViewのCheckBoxにデータベースのデータをバインドする方法
はじめにこの記事では、データベースから取得したデータを、AndroidアプリのListView内に配置したCheckBox(チェックボックス)にバインドする方法を、実際のコード例をもとにステップごとに解説します。サンプルでは、Androidのバージョンコードネームの一覧をリスト形式で表示し、各行のチェックボックスで選択状態を切り替えられるようにします。ステップ1:新規プロジェクトを作成するAndroid Studioを起動し、メニューから「File」⇒「New Project」を選択して、新しいプロジェクトを作成します。必要な項目をすべて入力し、プロジェクトのセットアップを完了させてください。
-
Androidからマルウェアを削除する方法|感染の兆候と予防策を徹底解説
現代社会において、スマートフォンは生活に欠かせない存在となっています。銀行アプリ、ナビゲーションアプリ、各種ユーティリティアプリなど、個人の重要な情報や機能がほぼすべて詰まっています。だからこそ、プライバシーを守るためにも、スマートフォンをしっかりと保護することが何よりも重要です。パソコンと同様に、Androidスマートフォンもウイルス、トロイの木馬、スパイウェア、アドウェアなどの悪意あるプログラム(マルウェア)に感染する可能性があります。Androidマルウェアの主な目的は、機密情報の窃取、無関係な広告の表示によるユーザーの誤誘導、悪質なサイトへのリダイレクトなどです。マルウェアはさまざまな