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
相关产品推荐
相关产品推荐

