使用接口为Fragment生成列表时Model类实例创建异常问题
问题分析与解决方案
1. 打印item显示对象地址的问题
你看到的com.bb.App.MyModelClass@a28b423是普通类默认的toString()输出格式,Kotlin中普通类默认继承Any类的toString方法,输出规则为「类名@内存哈希值」,不属于错误,只是没有输出属性内容而已。
- 解决方案:将
MyModelClass改为Kotlin数据类(data class),数据类会自动生成包含属性值的toString、equals、hashCode方法:
data class MyModelClass( var title: String, var images: ArrayList<String> )
2. 列表添加元素后为空的核心问题
原因
你在接口中仅声明了val list: ArrayList<MyModelClass>这一抽象属性,接口本身不会对该属性做初始化操作,所有实现该接口的类(你的Fragment)必须主动重写该属性,并为其赋值一个已经实例化的ArrayList对象,否则接口中list += item的操作是在操作未初始化的集合实例,自然无法添加元素,打印出来就是空列表。
正确实现示例
你的Fragment实现该接口时必须完成接口要求属性的初始化:
class YourFragment : Fragment(), MyInterface { // 重写接口要求的两个属性,完成初始化 override val mcontext: Context get() = requireContext() override val list: ArrayList<MyModelClass> = arrayListOf() // 调用接口方法填充列表 fun fetchData() { val finalList = getList() // 后续绑定列表到Adapter等逻辑 } }
额外优化建议
- 接口内的
list属性建议改为可变集合的声明,或者直接在getList方法内部创建新集合返回,避免外部持有集合引用导致的多端修改问题 - 解析JSON生成
MyModelClass实例时,建议单独校验title和images的空值,避免后续列表渲染出现异常
内容的提问来源于stack exchange,提问作者Anthon Santhez
相关产品推荐
相关产品推荐

