基于Item对象isValid属性实现不同点击事件的最优方案咨询
问题解答
能不能直接在Activity的Lambda里加if判断?
当然可以,你写的这种写法完全可行。不过要注意item.isValid!!的坑——如果isValid是可空的Boolean?类型,一旦它为null,!!会直接抛出空指针异常。建议换成更安全的写法:
listAdapter = ItemListAdapter() { item, _ -> if (item.isValid == true) { confirm(item) // 显示DialogFragment } else { undoAction(item) // 执行撤销操作 } }
这样哪怕isValid是null,也会走else分支,避免崩溃。
实现这个需求的最高效方式
这里的“高效”既要兼顾执行效率,也要考虑代码的可读性和后续维护成本,分两种情况说明:
逻辑简单(当前需求场景)
直接在Lambda里写分支判断就是最优解,原因如下:
- 没有多余的方法调用开销,执行效率拉满
- 符合关注点分离原则:Adapter只负责列表项的视图绑定和事件转发,业务逻辑和UI操作(弹Dialog、执行撤销)都放在Activity中,后续修改逻辑时直接调整Activity代码即可,无需改动Adapter
逻辑复杂(后续分支需扩展更多代码)
如果之后confirm或撤销操作的逻辑变得复杂,把这些逻辑拆成Activity里的独立方法会更清爽:
// Activity中单独定义处理点击的方法 private fun onItemClicked(item: Item) { if (item.isValid == true) { confirm(item) } else { undoAction(item) } } // 初始化Adapter时直接调用该方法 listAdapter = ItemListAdapter() { item, _ -> onItemClicked(item) }
这种写法不会影响执行效率,但能大幅提升代码的可读性和可维护性,后续修改逻辑只需调整onItemClicked这一个方法即可。
另外提醒:不要把分支逻辑放到Adapter中,这会让Adapter承担不属于它的业务职责,导致代码耦合度升高,后续扩展或修改需求会变得麻烦。
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

