読者です 読者をやめる 読者になる 読者になる

ListViewに追加,削除するサンプル

ListViewの勉強で作ったサンプル.

参考にしたページは以下.
http://techbooster.org/android/ui/9039/
http://www.mitoroid.com/category/android/android_listview2.php

動作は以下の通り.

  • 動作環境はAndroid 3.0以降(FragmentManagerを使っているので)
  • テキストボックス入力してボタンで追加
  • ListView内のアイテムを長押しで削除

意外と追加,削除といった動的な処理のサンプルは少ないようです.
探すとありますね.
DB操作も一緒になったサンプルとか.
http://handin.sakura.ne.jp/archives/368

package com.example.samplelistview;

import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog.Builder;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.app.FragmentManager;
import android.content.DialogInterface;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

/*
 * ListViewのアイテムを追加,削除するクラス
 * テキストボックスでアイテムを入力する.
 * ListViewアイテムの長押しで当該アイテムを削除する.
 */
public class MainActivity extends Activity {

    private static final String DEBUG = "DEBUG";
    private ArrayAdapter<String> adapter = null;
    private Button _button = null;
    private ListView _listView = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // LayoutファイルのListViewのリソースID
        _listView = (ListView) findViewById(R.id.list_view);

        // Androidフレームワーク標準のレイアウト
        adapter = new ArrayAdapter<String>(getApplicationContext(),
                android.R.layout.simple_list_item_1);

        // ListViewの初期表示
        adapter.add("Japan");
        adapter.add("Tokyo");

        _listView.setAdapter(adapter);

        // ListViewアイテムを選択した場合の動作
        _listView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                // 選択したListViewアイテムを表示する
                ListView list = (ListView) parent;
                String selectedItem = (String) list.getItemAtPosition(position);
                Toast.makeText(getApplicationContext(), selectedItem,
                        Toast.LENGTH_LONG).show();
                Log.d(DEBUG, selectedItem);
            }
        });

        // ListViewアイテムの長押しでListViewアイテムを削除する
        // リスナーはAdapaterView.onItemLongClickListener()を利用する
        // 利用しないとListViewのアイテムを取得できない
        _listView.setOnItemLongClickListener
                (new AdapterView.OnItemLongClickListener() {

                    @Override
                    public boolean onItemLongClick(AdapterView<?> parent,
                            View view, int position, long id) {
                        ListView list = (ListView) parent;
                        String selectedItem = (String) list
                                .getItemAtPosition(position);
                        Log.d(DEBUG, "Long click : " + selectedItem);

                        showDialogFragment(selectedItem);
                        return false;
                    }
                });

        // EditTextのエントリをListViewアイテムに追加する
        _button = (Button) findViewById(R.id.add_list_button);
        _button.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {

                EditText editText = (EditText) findViewById(R.id.add_edit_text);
                String entry = editText.getText().toString();

                if (entry.equals("")) {
                    Log.d(DEBUG, "Entry is empty");
                } else {
                    addListData(entry);
                }
                // ボタン押下後のエントリ文字列を削除する
                editText.setText("");
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    // ListViewアイテムにエントリを追加するメソッド
    private void addListData(String entry) {
        adapter.add(entry);
    }

    // FragmentManagerでDialogを管理するクラス
    private void showDialogFragment(String selectedItem) {
        FragmentManager manager = getFragmentManager();
        DeleteDialog dialog = new DeleteDialog();
        dialog.setSelectedItem(selectedItem);
        
        dialog.show(manager, "dialog");
    }
    
    /*
     * 削除ダイアログを生成する内部クラス
     * 内部クラスは外部クラスのインスタンスを直接参照できないため,
     * Activity#getActivity()で外部クラスのインスタンスを取得している.
     */
    public static class DeleteDialog extends DialogFragment {
        
        private static final String DEBUG = "DEBUG";
        /* 選択したListViewアイテム */
        private String selectedItem = null;

        // 削除ダイアログの作成.
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            Log.d(DEBUG, "onCreateDialog()");
            
            Builder builder = new AlertDialog.Builder(getActivity());
            builder.setTitle("Delete entry.");
            builder.setMessage("Are you really?");
            
            // positiveを選択した場合の処理.
            // リスナーはDialogINterface#onClickListener()
            // を使うことに注意.
            builder.setPositiveButton("Yes I'm serious.",
                    new DialogInterface.OnClickListener() {
                
                // 外部クラスのインスタンスを直接参照することができないため,
                // Activity#getActivity()でActivityのインスタンスを取得する
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    MainActivity activity = (MainActivity) getActivity();
                    activity.removeItem(selectedItem);
                }
            });
            AlertDialog dialog = builder.create();
            return dialog;
        }
        
        // 選択したアイテムをセットする.
        // HACK:削除ダイアログ自身に選択したアイテムを渡せないため,
        // ダイアログをユーザが呼び出した際に,Activityで選択した項目を保持しておく.
        public void setSelectedItem(String selectedItem) {
            Log.d(DEBUG, "setSelectedItem() - item : " + selectedItem);
            this.selectedItem = selectedItem;
        }
    }

    // 選択したアイテムを削除する.
    protected void removeItem(String selectedItem) {
        Log.d(DEBUG, "doPositiveClick() - item : " + selectedItem); 
        adapter.remove(selectedItem);
    }
}