【はじめてのKotlinプログラミング(22)】続・ToDoアプリ(余分なコードを修正して短くしてみる)

前回、ListViewに項目を追加したり、削除したりできる
簡易版ToDoアプリのようなものを作ってみました。

【はじめてのKotlinプログラミング(21)】ListViewを使った簡単なToDoアプリを作ってみよう

今回はその続きというか、ちょっとした補足です。

右上に、なにやら小さい忠告が出ているかと思います。

Redundant SAM – constructor

Redundantってのは「余分な」とか「冗長な」って意味です。

余計なコードを削除して、もう少しだけコードをスッキリさせてみましょう

動画

コード

▼activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <Button
        android:id="@+id/btnAdd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="+"
        android:textSize="20sp"
        android:textStyle="bold"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent" />

    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:layout_editor_absoluteX="1dp"
        tools:layout_editor_absoluteY="1dp" />


</androidx.constraintlayout.widget.ConstraintLayout>

▼MainActivity.kt

package com.example.simpletodoapp

//import android.content.DialogInterface
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.ArrayAdapter
import android.widget.Button
import android.widget.EditText
import android.widget.ListView
import androidx.appcompat.app.AlertDialog

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        //Viewの取得
        val btnAdd:Button =findViewById(R.id.btnAdd)
        val lv:ListView =findViewById(R.id.lv)

        //1)アダプターに入れてListViewにセット
        val adapter =ArrayAdapter<String>(
            this,
            android.R.layout.simple_list_item_1,
            mutableListOf()//最初は空っぽのリスト/ arrayListOf()
        )
        lv.adapter =adapter

        //2)+ボタンでアラートダイアログ
        btnAdd.setOnClickListener {
            //3)EditTextをnewする(or中身を入れる)
            val et =EditText(this)

            AlertDialog.Builder(this)
                .setTitle("項目の追加")
                .setMessage("何をする?")
                .setView(et)
                .setPositiveButton("追加"){ _, _ ->
                    //4)add()でアダプターに追加する
                    val myTodo =et.text.toString()
                    adapter.add(myTodo)
                }
                .setNegativeButton("キャンセル",null)
                .show()
        }

        //5)ListViewをタッチしたらアラートダイアログ
        lv.setOnItemClickListener { _, _, i, _ ->
            AlertDialog.Builder(this)
                .setTitle("削除しますか")
                //6)Yesを押したらremoveで削除
                .setPositiveButton("Yes"){ _, _ ->
                    adapter.remove(adapter.getItem(i))
                    //adapter.notifyDataSetChanged()//画面を更新する呪文
                }
                .setNegativeButton("No",null)
                .show()
        }
    }
}

テキスト

前回作ったコードの微妙なWarningを修正していきます。

まずは、新しく出てきた、Redundant なんちゃらかんちゃらつーやつですね。

Redundant SAM – constructor

こっちを先にやっていきましょう。

Redundantってのは「余分な」とか「冗長(じょうちょう)な」って意味です。
それさえ知っておけば後は何ゆーてるかわからないとしても、

余計なって意味なので省略できるんだろうなって想像できるかなと思います。

で、37行目ってことで、そこを見てみると
DialogInterfaceのところが
灰色というか、ちょっと文字が薄い色になってるので
ここは余分なので省略しても構わないようです。

もう1つは、51行目ということですが
ここも同じくDialogInterfaceのところですね。
色がちょっと薄くなっているので、余分なってことで省略してもいいようです。

ただまあ、消せばいいというだけじゃなくって、ちょっと一手間加える必要があるので
1つずつやっていきましょう。

1.DialogInterface.OnClickListener をカット

それではやっていきましょう。
DialogInterface.OnClickListenerのところが
薄くなって省略してもいいですよーっつうことなので
お言葉にあまえて、バッサリいっちゃいましょう。

カット

これでOKかと思いきや、
波カッコの中に、下線ズーッとが敷かれていますね。

 

2.{}もろとも、()の外に出す。

これ()の外に出しなさいってことなので
{}もろとも、()の外に出す。
で、コンマはいらないので削除。

                .setPositiveButton("追加"){ dialogInterface, i ->
                    //4)add()でアダプターに追加する
                    val myTodo =et.text.toString()
                    adapter.add(myTodo)
                }

これでOKです。
ひとまず、こっちに2つあったやつが1つに減りました。

 

3.使わない引数は「_」(アンダーバー)にリネーム

あとは使わない引数はですね、37行目
使わないんだったら renamed to _ アンダーバーにリネームしなさいよと言っているようなので
これらの2つを_にリネームしましょう。

これで、1か所が終了。

                .setPositiveButton("追加"){ _, _ ->
                    //4)add()でアダプターに追加する
                    val myTodo =et.text.toString()
                    adapter.add(myTodo)
                }

もう1つ目は51行目。
同じことをするだけなので、復習がてらやってみましょう。

DialogInterface.OnClickListenerは省略できるのでカット。
{}は外に出すので、これらもろとも、()の外に。
コンマはいらないので消してあげて
こっちの引数は、前回すでにアンダーバーに書き換えていたのでこれで完成と。

で、DialogInterfaceは使ってないので、インポート文も不要。

//import android.content.DialogInterface

みたいな感じになります。

まあこれで幾分スッキリしたわけですが、
慣れるまでは、DialogInterfaceを使った方がandroid先生に自動でテンプレートを挿入してもらえるので
個人的にはオススメです。
で、書いたあとで、削除したければ、不要なところを省略すると。いう風にするとミスが少ないかなと思います。

あとは47行目も、リネームしなさいよということなので
47行目。これですね。

小さい波線が敷かれているやつを、使わないんだったらアンダーバーにしなさいよということのようです。
iはここ(getItem(i))で使っているので消したらダメですね。
それ以外の3つです。

てことでadapterViewをアンダーバー、
viewをアンダーバー
lをアンダーバー。

これで、全ての忠告が消えたかと思います。
コードも幾分スッキリしました。

以上、ToDoアプリの補足解説でした。

    コメントを残す