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(); } } }
コメント