我试图了解 RecylerView.adapter
的设计 . onCreateViewHolder
方法接受视图类型作为参数 .
onCreateViewHolder(ViewGroup parent, int viewType)
当RecyclerView需要新的给定类型的RecyclerView.ViewHolder来表示项目时调用 .
此视图类型映射在getItemViewType中
getItemViewType(int position)
为了查看回收的目的,返回项目的视图类型 .
最后在绑定ViewHolder时调用bindViewHolder
onBindViewHolder(VH holder, int position)
由RecyclerView调用以在指定位置显示数据 .
为什么在onBindViewHolder中定位一个参数?我的理解是发送到onCreateViewHolder的viewType允许开发人员根据视图类型创建适当的ViewHolder . 如果是这种情况,onBindViewHolder中的位置是多余的,不必要的 .
我是否正在考虑正确使用RecyclerView.adapter类?它让我质疑我的理解是将position参数传递给onBindViewHolder,这似乎是尖叫使用,但是在我当前的实现中确实没有必要,因为我的ViewHolders已经使用从位置映射的视图类型创建了 .
1 回答
所以你知道要绑定到
ViewHolder
的数据 .RecyclerView
旨在显示数据集合; aViewHolder
将该集合中的一个项目绑定到其视图 .只有当您始终将
RecyclerView
与零或一项模型数据集合一起使用时,在这种情况下您不应使用RecyclerView
.视图类型用于截然不同的结构视图,例如 Headers 和详细信息 . 视图类型与位置无关,这就是位置未传递到
onCreateViewHolder()
的原因 .因此,例如,假设您要显示来自lorem ipsum列表的25个拉丁单词的垂直滚动列表 . 默认情况下,有一种视图类型(即,您不覆盖
getItemViewType()
),并将该单词绑定到onBindViewHolder()
中列表行的TextView
(或其他) .如果在您的25字列表
RecyclerView
的实现中,您使用的是25种视图类型,那么很可能您做错了 . 可能含糊不清的唯一情况是每行的结构是否非常不同(第一行是TextView
,第二行是ImageButton
,第三行是ImageView
加上Switch
等) .例如,这是一个托管
RecyclerView
以显示25个字的列表的活动:这延伸了a simple RecyclerViewActivity我作为
ListActivity
的对应物拼凑在一起,但大多数逻辑都在这里,在Adapter
和ViewHolder
. 如果需要,您还可以查看整体the full project和~20 RecyclerView sample projects .