前回、RecyclerViewを使ってTodoアプリを作ってみました。
今回はそのおまけというか、アダプタークラス(RecyclerAdapter.kt)のファイルに3つほど、軽めの忠告が出ていますので、それについて修正の解説。
動画
テキスト
①Redundant string template
は、{}を使うのであれば
.setTitle(“${listPosition.myTodo}ですよ”)
みたいに、変数と文字を連結させると、表示は消えます。
②Redundant SAM-constructorの方は
DialogInterface.OnClickListener
これは文字が薄くなって省略してもいいですよーっつうことなので
お言葉にあまえて、バッサリいっちゃいましょう。
そうすると、
波カッコの中に、下線ズーッとが敷かれていますね。
これ()の外に出しなさいってことなので
{}もろとも、()の外に出す。
で、コンマはいらないので削除。
これでですね、Yesを押した時の処理を、
波カッコの中で実行しますよ、っていう書き方になりました。
//15)yesボタンを押した時の処理
.setPositiveButton("Yes"){ _, _ ->
todoList.removeAt(position)
//16)表示を更新
rAdapter.notifyItemRemoved(position)
}
で、こうなってくると上のimportのDialogInterfaceがいらないので、これは削ってあげましょう。
コード
▼RecyclerAdapter.kt
package com.example.recyclertodo
import android.app.AlertDialog
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
//import android.widget.Toast
import androidx.recyclerview.widget.RecyclerView
//5)リストを用意 クラス名(private val 変数名:ArrayList<データクラス>) //or MutableList
class RecyclerAdapter(private val todoList:ArrayList<TodoData>) :RecyclerView.Adapter<RecyclerAdapter.ViewHolderItem>() {
//listOf
//5)ViewHolder(インナークラス)
//16),rAdapter : RecyclerAdapter// RecyclerAdapterを受け取る
inner class ViewHolderItem(v:View,rAdapter:RecyclerAdapter) :RecyclerView.ViewHolder(v) {
val tvHolder : TextView = v.findViewById(R.id.tv)
//12)クリック処理(1行分の画面(view)が押されたら~)
init {
v.setOnClickListener {
val position:Int = adapterPosition
val listPosition = todoList[position]
//14)アラートダイアログ
AlertDialog.Builder(v.context)
//.setTitle("${listPosition.myTodo}")
.setTitle("${listPosition.myTodo} です")
.setMessage("本当に削除しますか")
//15)yesボタンを押した時の処理
.setPositiveButton("Yes"){ _, _ ->
todoList.removeAt(position)
//16)表示を更新
rAdapter.notifyItemRemoved(position)
}
.setNegativeButton("No",null)
.show()
//13)トーストでposition番目を表示してみる
//Toast.makeText(v.context,"$listPosition",Toast.LENGTH_SHORT).show()
//Toast.makeText(v.context,"${listPosition.myTodo}",Toast.LENGTH_SHORT).show()
}
}
}
//6)一行だけのViewを生成
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolderItem {
val itemXml = LayoutInflater.from(parent.context)
.inflate(R.layout.one_layout,parent,false)
return ViewHolderItem(itemXml,this) //16)RecyclerAdapterを受け渡す
}
//7)position番目のデータをレイアウト(xml)に表示するようセット
override fun onBindViewHolder(holder: ViewHolderItem, position: Int) {
val currentItem = todoList[position] //何番目のリスト(アイテム)ですか
holder.tvHolder.text = currentItem.myTodo //そのリストの中の要素を指定して代入
}
//8)リストサイズ
override fun getItemCount(): Int {
return todoList.size
}
}