今現在、「はじめてのAndroidプログラミング」という参考書でコードを打ちながら勉強しているのですが、処理の動きが理解できないところがあります。
分からないところは、RecyclerViewのセルがタップされた時に呼び出される関数がまずMainActivityのadapter.setOnItemCickListenerなのか、adapterのholder.setOnClickListenerなのかが分からないです。
関数の意味自体はこれであってますか?
adapterで関数型の変数listenerを宣言
setOnItemClickListernerで引数で受け取ったらlistenerに格納する
holder.itemView.setOnClickListenerでlistenerに格納されている関数にタップされたデータのidを渡して動かす。
MainActyvityのadapter.setOnItemClickListenerで、listenerにScheduleEditActivityに選択されたidを渡して画面遷移する。
adapter
1package com.example.myscheduler 2 3import android.text.format.DateFormat 4import android.view.LayoutInflater 5import android.view.View 6import android.view.ViewGroup 7import android.widget.TextView 8import androidx.recyclerview.widget.RecyclerView 9import io.realm.OrderedRealmCollection 10import io.realm.RealmRecyclerViewAdapter 11 12class ScheduleAdapter(data: OrderedRealmCollection<Schedule>): 13//第一引数:表示したい項目,第2引数セルに表示するビューを保持 14//コンストラクタ 15// 第一:RecyclerViewに表示するデータ 16//第2:trueの場合表示を自動更新 17 RealmRecyclerViewAdapter<Schedule, ScheduleAdapter.ViewHolder>(data, true){ 18 19 private var listener: ((Long?)-> Unit)? = null 20 21 fun setOnItemClickListener(listener:(Long?)-> Unit){ 22 this.listener = listener 23 } 24 25 init{ 26 //RecyclerViewを高速描画するために必要 27 setHasStableIds(true) 28 } 29 //セルに使用するビューを保持したもの 30 //引数:セルに使用するビュー 31 class ViewHolder(cell: View) : RecyclerView.ViewHolder(cell){ 32 //xmlファイル内のテキストビューをセルに使う 33 val date: TextView = cell.findViewById(android.R.id.text1) 34 val title: TextView = cell.findViewById(android.R.id.text2) 35 } 36 //セルが必要となるたびに呼び出される 37 //引数第一:追加先のViewGroup 38 //第2:新しいビューのタイプ(使わない) 39 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ScheduleAdapter.ViewHolder { 40 //xmlファイルからビューを生成するためインスタンスを生成 41 val inflater = LayoutInflater.from(parent.context) 42 //レイアウトxmlからビューを生成 43 val view = inflater.inflate(android.R.layout.simple_list_item_2, 44 parent, false) 45 46 return ViewHolder(view) 47 } 48 49 50 //ビューホルダーに保存されたビューにデータなどを設定する 51 override fun onBindViewHolder(holder: ScheduleAdapter.ViewHolder, position: Int) { 52 //データベースから項目取得 53 val schedule: Schedule? = getItem(position) 54 //値をセット 55 holder.date.text = DateFormat.format("yyyy/MM/dd", schedule?.date) 56 holder.title.text = schedule?.title 57 //セルがタップされた時 58 holder.itemView.setOnClickListener{ 59 listener?.invoke(schedule?.id) 60 } 61 } 62 63 //IDを返す。高速化に必要 64 override fun getItemId(position: Int): Long { 65 return getItem(position)?.id ?: 0 66 } 67} 68
MainActyvity
1class MainActivity : AppCompatActivity() { 2 //lateinit型: val初期化をOnCreateまで遅らせる 3 private lateinit var realm: Realm 4 5 override fun onCreate(savedInstanceState: Bundle?) { 6 super.onCreate(savedInstanceState) 7 setContentView(R.layout.activity_main) 8 setSupportActionBar(toolbar) 9 //インスタンスを取得 10 realm = Realm.getDefaultInstance() 11 //レイアウトマネージャの役割:セルの配置方法を決める 12 // セルを直列に並べる 13 list.layoutManager = LinearLayoutManager(this) 14 //すべてのレコードを取得 15 val schedule = realm.where<Schedule>().findAll() 16 //表示したいレコードを渡してインスタンス化 17 val adapter = ScheduleAdapter(schedule) 18 //アダプターを設定 19 list.adapter = adapter 20 21 fab.setOnClickListener { view -> 22 val intent = Intent(this, ScheduleEditActivity::class.java) 23 startActivity(intent) 24 } 25 26 adapter.setOnItemClickListener { id-> 27 val intent = Intent(this, ScheduleEditActivity::class.java) 28 .putExtra("schedule_id", id) 29 startActivity(intent) 30 } 31 32 33 } 34 35 //アクティビティを終了 36 override fun onDestroy() { 37 super.onDestroy() 38 //リソース開放 39 realm.close() 40 } 41 42}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。