虎視眈々と

Flutter × Firebaseを研究するアプリエンジニア

RecyclerViewでアイテムのクリックイベントを受け取る

フラグメントにinterfaceを実装する。

 interface ItemListEventListener {
      fun onTapItem(view: View, id: Int)
  }

fragmentでimplementして実装を書く

ここではinterfaceの実装と、adapterにイベントリスナーの実装を渡している

 class ItemListFragment : Fragment(), ItemListEventListener {  
     override fun onCreateView(
         inflater: LayoutInflater, container: ViewGroup?,
         savedInstanceState: Bundle?
     ): View? {
 
         binding = FragmentItemListBinding.inflate(inflater, container, false)
 
         setupLayout()
 
         return binding.root
     } 
     override fun onTapItem(view: View, id: Int) {
         // タップイベントがあるとここが呼ばれる
     }
     
     private fun setupLayout() {
         itemAdapter = ItemListAdapter(this)
         val manager = ItemLayoutManager(itemAdapter, requireContext())
 
         binding.productList.run {
             layoutManager = manager
             adapter = itemAdapter
         }
      }
 }

adapterで引数として受け取る

 class ItemListAdapter(private val eventListener: ItemListEventListener) : ListAdapter<ProductListItem, RecyclerView.ViewHolder>(DiffUtilCallback) {
 
 // なんかの実装

adapter側でタップイベントを設定してリスナーとして渡す

 override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
         if (holder is ProductItemHolder) {
             val item = getItem(position)
             holder.binding.model = item
             holder.binding.productItem.setOnClickListener {
                 eventListener.onTapItem(it, item.id)
             }
          }
 }

これでタップイベントを受け取れる

参考

y-anz-m.blogspot.com