ListViewのデータ登録と削除。DialogFragmentとActivity間でのデータの受け渡し練習。

Q1
フォームよりリストビューにデータを登録できるようにする。
リストビューに登録されたデータは、クリックすると下部にその単語の意味を表示。
ロングクリックで項目を削除できるようにせよ。
削除の際には確認のダイアログを表示すること。

[実行例]

スタート画面

フォームにデータを入力する。

登録ボタンを押すとリストに登録される。

項目をクリックすると下部にその単語の意味が表示される。
(下図はword2をクリックした場合)

項目を長押しすると確認のダイアログを表示する
(下図はword2を長押しした場合)

はいを押すと項目が削除される

●activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <ListView
        android:layout_width="0dp"
        android:layout_height="200dp"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginTop="8dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:id="@+id/lv" />

    <TextView
        android:id="@+id/tvResult"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginTop="16dp"
        android:textSize="18sp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/lv" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="8dp"
        android:text="単語"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintBaseline_toBaselineOf="@+id/etWord" />

    <EditText
        android:id="@+id/etWord"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="text"
        android:text=""
        app:layout_constraintLeft_toRightOf="@+id/textView2"
        android:layout_marginLeft="8dp"
        android:layout_marginTop="8dp"
        app:layout_constraintTop_toBottomOf="@+id/tvResult" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="8dp"
        android:text="意味"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintBaseline_toBaselineOf="@+id/etBody" />

    <EditText
        android:id="@+id/etBody"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="text"
        android:text=""
        android:layout_marginTop="8dp"
        app:layout_constraintTop_toBottomOf="@+id/etWord"
        app:layout_constraintLeft_toRightOf="@+id/textView3"
        android:layout_marginLeft="8dp" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginTop="8dp"
        android:onClick="btRegister"
        android:text="登録"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/etBody" />
</android.support.constraint.ConstraintLayout>



●MainActivity.java




import android.app.Dialog;
import android.app.DialogFragment;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private ListView lv;
    private EditText etWord,etBody;
    private TextView tvResult;
    private List<Word> list=new ArrayList<>();
    private ArrayAdapter<Word> adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //findView
        lv=(ListView)findViewById(R.id.lv);
        etWord=(EditText)findViewById(R.id.etWord);
        etBody=(EditText)findViewById(R.id.etBody);
        tvResult=(TextView)findViewById(R.id.tvResult);
        //adapter生成
        adapter=new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,list);
        //リストビュー表示
        lv.setAdapter(adapter);
        //クリックリスナー登録
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                //positionからWordインスタンスを取得
                Word w=list.get(position);
                //テキストビューに表示
                tvResult.setText(w.getBody());
            }
        });
        //長押しリスナー登録
        lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                //Wordインスタンス取得
                Word word=list.get(position);
                //ダイアログフラグメントをnew
                DialogFragment dialog=new MyDialog();
                //バンドルオブジェクトを生成
                Bundle b=new Bundle();
                //インスタンスを送るにはputSerializable
                b.putSerializable("word",word);
                //バンドルがセットされる。
                dialog.setArguments(b);
                //ダイアログ表示
                dialog.show(getFragmentManager(),"tag");
                //イベント消費する。
                return true;
            }
        });

    }
    //ボタンが押された時の処理
    public void  btRegister(View v){
        //エディットテキストから情報を収集
        String word=etWord.getText().toString();
        String body=etBody.getText().toString();
        //情報からインスタンスを生成してリストに登録する。
        list.add(new Word(word,body));
        //リストに変更があったことをアダプターに知らせる(再描画
        adapter.notifyDataSetChanged();
        //項目を空に
        etWord.setText("");
        etBody.setText("");
        //フォーカスを移す
        etWord.requestFocus();

    }
    //リストビューから引数で渡されたインスタンスを削除するメソッド
    public void removeList(Word word){
        //アダプターからremove(インスタンス)すればOK
        adapter.remove(word);
        //テキストビューを空に
        tvResult.setText("");
        //Toastで文言表示
        Toast.makeText(this,word+"を削除しました",Toast.LENGTH_SHORT).show();
    }
    //クラス間をまたいで送信される場合はSerializableインターフェイスを実装する。
    public static class Word implements Serializable{
        private String word;
        private String body;
        public Word(String word,String body){
            this.word=word;
            this.body=body;
        }
        //標準出力を設定
        @Override
        public String toString() {
            return this.word;
        }
        public String getBody(){
            return this.body;
        }
    }
    //ダイアログフラグメントクラス
    public static class MyDialog extends android.app.DialogFragment{
        //onCreateDialogをオーバーライドする。
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {

            //バンドルされたオブジェクト取得
            final Word word=(Word)(getArguments().getSerializable("word"));
            //上記処理を省略せずに書くと以下
//            Bundle b=this.getArguments();
//            Serializable s=b.getSerializable("word");
//            final Word word=(Word)s;

            //ダイアログはAlertDialog.Builderクラスのインスタンスを最初に作る
            AlertDialog.Builder builder=new AlertDialog.Builder(getActivity());
            //builderインスタンを用いてダイアログの設定
            builder.setTitle("確認")
                    .setMessage("["+word+"]を本当に削除してよろしいですか?")
                    .setPositiveButton("yes", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface ialog, int which) {
                            //組み込まれたアクティビティーを取得
                            MainActivity activity=(MainActivity)getActivity();
                            //そこにあるremoveListを実行
                            activity.removeList(word);
                        }
                    })
                    .setNegativeButton("no", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {

                        }
                    });
            //builder.createでダイアログが作成される。
            return builder.create();
        }
    }
}