我有一个RecyclerView和一个带有两个列表的RecyclerView适配器,我需要切换到mutableMaps。itemList
保存用于显示数据的视图,而skillList
保存包含数据的Skill
对象。
问题是,views
对象多于Skill
对象。例如,我创建了一个技能,而Skill
有一个id、一个图片和一个音频文件。例如,viewPic
显示图片,viewMp3
显示音频文件,viewId
显示Skill
对象的id。
原因是用户能够显示不同按钮按下时的数据。
现在,我希望避免无法将正确的数据绑定到position
的正确视图的问题。
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val currentViewItem= itemList[position]
val currentSkillItem=skillList[position]
when(holder){
is SkillbarViewHolder ->{
}
is SkillTextViewHolder ->{
//holder.add_skill_add_text_textview.text=currentSkillItem.addSkillTextCont
}
is SkillUploadViewHolder ->{
}
is SkillMicroViewHolder ->{
我找不到将对象的正确数据绑定到正确视图的方法,因为多个views
使用相同的对象数据,所以列表大小不同。
这是我的适配器类OldAdapterclass
这是我的活动Activity
现在,我想将itemList更改为mutableMap〈index,View〉,并将skillList更改为mutableMap〈index,Skill〉
我想达到这样的目标:
addBarButton()
create var index
calls createSkill()
in SkillbarAdapter createSkill()
creates Skill
skillList.put(index,Skill)
In SkillbarAdapter addSkillView()
itemList.put(index,View)
view.tag=“xxx"
如果addBarButton被调用,它会设置index +1
,并使用该index
创建Skill
(键为index
)。然后视图会被添加到itemList
的键index
处,以便稍后我可以确定哪个视图连接到哪个Skill
对象。由于标签,我还可以看到它是什么类型的视图。我希望我解释清楚了。
因此,尝试相应地更改Adapterclass,但我在getItemViewType
方法中抛出错误,表明viewtype
无效。
NewAdapterclass
你知道我在循环视图适配器中的Map做错了什么吗??我也不知道我应该如何改变getItemViewType方法。
错误为:Error
无效的视图类型意味着位置顺序索引有错误,视图没有正确的放入itemList或者没有视图,我猜.因为我检查了getItemViewType是否是视图,如果不是,那么它抛出一个异常.
1条答案
按热度按时间ozxc1zmp1#
问题
你做的事情是相反的。你在
onCreateViewHolder
中设置视图标签。但是你会注意到onCreateViewHolder
在viewType
中被传递。这意味着getViewType
必须在onCreateViewHolder
之前被调用,以知道为什么类型创建ViewHolder。但是你的getViewType
依赖于view.tag
属性,而view.tag
属性还没有被设置。因此你犯了错误。解决方案
您不应该使用
view.tag
作为创建类型的决定因素。根据定义,getViewType
还不知道存在哪些视图-该函数本身决定将为给定位置创建哪些视图。您需要对其进行更改,以便在给定项目列表和传入的位置值的情况下返回正确的视图类型。这是只有您自己知道的业务逻辑。
skillList
和itemList
中的项目列表,position
中的视图应该是什么类型?*