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