You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MVC架构中如何正确实现RecyclerView及其OnClick点击事件

MVC架构下RecyclerView点击事件最简实现方案

以下实现完全符合MVC分层规范,无多余封装,逻辑清晰易理解,全程不依赖第三方库。

1. 定义Model层(数据实体)

仅负责存储列表条目数据,不参与任何UI和逻辑处理

// 可根据自身业务修改字段
data class ItemBean(
    val id: Int,
    val content: String
)

2. 实现View层(Adapter+回调接口)

仅负责UI渲染,点击事件直接抛出不处理业务逻辑

class CommonRvAdapter(private val dataList: List<ItemBean>) : RecyclerView.Adapter<CommonRvAdapter.ViewHolder>() {
    // 定义点击事件回调接口,把点击的条目数据和位置抛给上层
    var onItemClickListener: ((item: ItemBean, position: Int) -> Unit)? = null

    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val tvContent: TextView = itemView.findViewById(R.id.tv_content)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.item_rv_common, parent, false)
        return ViewHolder(view)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val currentItem = dataList[position]
        holder.tvContent.text = currentItem.content
        // 绑定条目点击事件
        holder.itemView.setOnClickListener {
            onItemClickListener?.invoke(currentItem, position)
        }
        // 若需要给条目内子控件加点击,给对应控件设置点击监听器,同理抛回调即可
    }

    override fun getItemCount() = dataList.size
}

对应条目布局item_rv_common.xml按需编写即可,无特殊要求。

3. Controller层(Activity/Fragment)处理业务逻辑

负责数据加载、点击事件的业务处理

class RvDemoActivity : AppCompatActivity() {
    // 模拟数据源,实际项目可从本地/网络获取
    private val mockData = mutableListOf<ItemBean>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_rv_demo)

        // 初始化测试数据
        for (i in 0..19) {
            mockData.add(ItemBean(i, "第${i+1}条条目"))
        }

        // 初始化RecyclerView
        val recyclerView = findViewById<RecyclerView>(R.id.recyclerView)
        recyclerView.layoutManager = LinearLayoutManager(this)
        val adapter = CommonRvAdapter(mockData)
        recyclerView.adapter = adapter

        // 接收点击事件,处理自身业务逻辑
        adapter.onItemClickListener = { item, position ->
            // 此处替换为自己的业务逻辑,比如弹提示、跳转页面、修改数据等
            Toast.makeText(this, "点击了第${position+1}条,内容:${item.content}", Toast.LENGTH_SHORT).show()
        }
    }
}
  • 各层完全解耦:Model仅存数据、View仅做UI渲染、Controller仅处理业务,符合MVC架构要求
  • 可扩展性强:后续增加子控件点击、长按事件等需求,仅需在Adapter中新增对应回调接口即可

内容的提问来源于stack exchange,提问作者HoLoGram

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 11:24:03