我有两个RecyclerView.Adapter
使用与内部类完全相同的RecyclerView.ViewHolder
。
我想摆脱代码重复并使这些ViewHolder
免费,单独的类,所以现在任何RecyclerView.Adapter
都可以使用全新的类。
但是,我遇到了许多麻烦,例如访问适配器对象的困难。 getAdapterPosition()
始终返回-1
。
所以我改变主意并创建了一个超级RecyclerView.Adapter
类,它由这些适配器扩展,并将ViewHolder放在超类中,以便这些适配器可以从子类中使用它。
但我想知道ViewHolder
是否必须是内部类。这让我很生气。请不要建议我合并适配器类,它们完全不同,因为ViewHolder
只是一个特殊的viewType
,可以出现在任何RecyclerView
我在等待你让我感觉更好的更好的方法。
问候。
答案 0 :(得分:6)
ViewHolder可以在课外。内部类只是RecyclerView的所有教程中的一个命题,如果您的ViewHolder应该可以访问所有适配器参数,甚至是那些私有参数,这是一种更好的方法,但是可以通过Adapter和ViewHolder中的访问方法重新创建任何访问或对象关系。 / p>
我创建了独立项目,将ViewHolder用作外部类,看一看。链接到存储库 - https://github.com/maciejsikora/outsideviewholder。
我认为问题的原因还在于,在第一个代码版本中,ViewHolder是一个内部类并且可以访问属性,在更改为外部类之后,代码应该已经重构,并且在结果中应深入检查ViewHolder和Adapter之间的所有关系。
问题的答案是 - ViewHolder不必是内部类,并且您的问题是由使用ViewHolder作为外部类的无效代码实现引起的。
答案 1 :(得分:4)
实际上,否。
首先,您需要了解我们为什么需要内部课程?
我们确实需要内部类,我们希望只有特定的类具有此功能。就像许多Listeners
和Button
onClick以及更多内容类一样。
所以我们使用内部类来使事物变得私密,简短和简单。
你可以把这个东西(ViewHolder
)作为一个单独的类。但是这样做不会有效,清楚(如果你创建另一个类,它将为你的项目添加一个额外的类),并且是有效的方法。
答案 2 :(得分:0)
我一直用它作为内心。我理解你的问题,我也处理了一段时间,我认为这篇文章有答案。这个答案的人也有适配器问题。
在此处查看: https://stackoverflow.com/a/29719632/6634292
你的问题是一个有趣的问题;)