android - 那么如何返回正确的 RecyclerView.ViewHolder
问题描述
在某一时刻,这是可以的,但编译器现在正对空返回值感到不满。我不确定如何设置它或者摆脱空值,返回正确的值或使返回值可选。任何有关如何启动和运行的建议表示赞赏。在网上找到了代码,但它说我编码的方式是有效的。
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
if(viewType==1) {
val v = LayoutInflater.from(parent.context).inflate(R.layout.bus_list_row, parent, false)
v.bus_url.setOnClickListener(object: View.OnClickListener {
override fun onClick(p0: View?) {
Toast.makeText(
v.context,
"|" + v.bus_url.text + "|",
Toast.LENGTH_SHORT
).show()
}
})
return RowViewHolder(v)
}
if(viewType==0){
val v = LayoutInflater.from(parent.context).inflate(R.layout.bus_list_section, parent, false)
/*v.setOnClickListener(object:View.OnClickListener{
override fun onClick(p0: View?) {
Toast.makeText(
v.context,
"|" + "test"+ "|",
Toast.LENGTH_SHORT
).show()
}
})*/
return SectionViewHolder(v)
}
return null
}
解决方案
让我们稍微精简一下您的代码,以便于讨论:
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { if(viewType==1) { // ... return RowViewHolder(v) } if(viewType==0){ // ... return SectionViewHolder(v) } return null }
基于此,我猜测您有一个相应的getItemViewType()
方法,并且从此返回的唯一可能值是0
and 1
。如果我是对的,那么正确的做法是将您的 toreturn null
更改onCreateViewHolder()
为throw AssertionError()
.
这里的逻辑是,作为人类,您比编译器更了解系统以及可能的情况。编译器只知道如果viewType
不是 0 或 1,你将返回 null 并且 null 是不允许的。但作为一个人类,你知道它viewType
只能是 0 或 1。调和这两个东西的正确方法是抛出一个错误。这样做有以下好处:
- 满足编译器
- 避免您必须编写代码来处理不可能的情况
- 提供安全性,防止
getItemViewType()
在未来某个时间点进行更改但忘记更新onCreateViewHolder()
(您将遇到一个非常明显的错误崩溃)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
if(viewType==1) {
// ...
return RowViewHolder(v)
}
if(viewType==0){
// ...
return SectionViewHolder(v)
}
throw AssertionError("impossible viewType: $viewType")
}
推荐阅读
- mongodb - 使用 mongodb 和 monstache 进行慢速弹性搜索索引
- angularjs - 尝试创建服务来构建我的 NgTable
- ruby - 删除方法单一!数组中的元素按谓词并返回已删除
- javascript - Vue Nuxt Axios:带代理的跨域 POST
- javascript - 从 android 调用 Native 模块并将事件从该模块发送到 React Native
- html - 使垂直对齐的父块随着孩子的成长而向右成长的最简单方法是什么?
- android - 将字符串从 DataBinding 传递到自定义视图 xml 属性
- watson-studio - 为什么在 watson Studio 中您没有部署模型网络或上传批次的选项?
- flask - Telegram 对 webhook Flask 应用程序的更新的结构是什么?
- continuous-integration - 我如何确保为不同的 git 分支提供不同的 Travis CI 工作流程