View Binding + RecyclerView + Adapter + Click Listener: 老生短谈,超短,不长。过路的:是吗?有多短?不是长的好吗?

本文介绍了如何在Android中结合View Binding、RecyclerView和Adapter实现点击监听。内容包括View Binding的优势,如何创建itemView,设置RecyclerView,实现点击事件监听以及简化Adapter的编写方式。

🗣0. 简介: 1234

😶:今天去 阿妈神😇 见工,现考。(刷人特快!)考题比银行的好多了,8 条 Android,一条 Java。开始一看,嘀咕:“啥,Java?我用 Kotlin 都快把 Java 忘光了。”
👩🏻:考场失忆症又犯了。
😣:大半场在回忆 Java 怎么复杂法。好在,终于拼出来了。TestCases passed。后面还有多少场就不知道了,不会象 G 哥,考五场吧?我通常在第三场 88 了。

😁:言归正传,说起 RecyclerView,说好用,也挺好用的。就是文字 adapter 多过 GUI,还有就是插进 Click() 麻烦,因为是 外挂🔌 不是 原生系。

RecyclerView 分成几部分:

  • 👀 RecyclerView
  • 👕 ItemView
  • ⚙️ Adapter
  • 🖱️ Click Listener

你瞧,只有 itemView 是作画面设计,其它都是打字。
剔、蹄、踢…


🎨1. 作图

🦠 itemView 单元作图

👧: 我是单细胞,来 clone(复制) 我吧。

view
我这个是显示学校的名字,文件:school_item.xml 。
View Binding 会自动产生 SchoolItemBinding.kt,这个隐藏的你看不见,知道就行。如果老是红杠,看 Gradle Module:

android {
   
   ...
    buildFeatures {
   
   
        viewBinding true
//        dataBinding true
    }
}

我不喜欢 dataBinding,一个字 —— 慢。View Binding 省了 findViewById(),多好。Sync 完如果还是红色的话,只有 Rebuild 了。


🖵 显示区域: RecyclerView

rev
这个根本就是设范围,没别的。

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:listitem="@layout/school_item">

还有,LayoutManager 这个要设地。
tools:listitem 可以帮你预览。


⚙️2. Adapter+ClickListener

👂 ClickListener 点击监听

Ctrl+Alt+s:搜索 Live Template,语言 Kotlin 加 新的
这个:
click

interface $class$ClickListener {
   
   
    fun $fun$_item_click($var$: $type$)
}

捷径的参数用 $$ 包围,这里有

$class$, $fun$, $var$, $type$

clicklistener

Fragment 使用 ViewBinding 本身不会直接导致内存泄漏,但在某些特定场景下,如果处理不当,可能会存在内存泄漏风险: ### 1. 未及时清理绑定 在 Fragment 的 `onDestroyView` 方法中,如果没有将 ViewBinding 置为 `null`,会导致 ViewBinding 持有对 Fragment 视图的引用,使得视图无法被垃圾回收。由于 Fragment 的生命周期中,`onDestroyView` 会在视图销毁时调用,而 Fragment 本身可能仍然存在,如果 ViewBinding 没有被清理,它会一直持有视图的引用,造成内存泄漏。 ```kotlin private var _binding: FragmentExampleBinding? = null private val binding get() = _binding!! override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { _binding = FragmentExampleBinding.inflate(inflater, container, false) return binding.root } override fun onDestroyView() { super.onDestroyView() _binding = null } ``` ### 2. 内部类持有外部类引用 如果在 ViewBinding 的使用过程中,使用了内部类(如匿名内部类),并且这些内部类持有了外部 Fragment 的引用,而这些内部类的生命周期又比 Fragment ,就会导致 Fragment 无法被回收,从而造成内存泄漏。例如,在点击事件的匿名内部类中: ```kotlin binding.button.setOnClickListener { // 这里的匿名内部类持有了 Fragment 的引用 // 如果在这个匿名内部类中有异步操作,可能会导致内存泄漏 } ``` ### 3. 异步操作持有 View 引用 如果在 Fragment 中进行异步操作(如网络请求、定时任务等),并且在异步操作的回调中持有了 ViewBinding 或视图的引用,当异步操作完成时 Fragment 可能已经销毁,但由于回调中仍然持有视图引用,会导致视图无法被回收。 ```kotlin // 模拟异步操作 GlobalScope.launch { delay(5000) withContext(Dispatchers.Main) { // 如果此时 Fragment 已经销毁,这里会导致内存泄漏 binding.textView.text = "Updated" } } ``` ### 4. 静态变量持有 View 引用 如果将 ViewBinding 或视图的引用赋值给静态变量,由于静态变量的生命周期是整个应用程序的生命周期,会导致视图无法被回收,从而造成内存泄漏。 ```kotlin companion object { // 错误示例,静态变量持有 View 引用会导致内存泄漏 private var staticBinding: FragmentExampleBinding? = null } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值