【发布时间】:2015-10-21 23:17:28
【问题描述】:
我有一个回收者的观点。我有许多不同内容类型的视图持有者。
我这样创建我的持有者:
/**
* Create instance of
* compatible viewholder
*
* @param viewType
* @param parent
* @return
*/
private AbstractHolder createAbstractHolder(int viewType, ViewGroup parent) {
AbstractHolder holder = null;
switch (viewType) {
case VersyConstants.HOLDER_TYPE_1:
holder = ViewHolder_Var1.create(parent, mUserHomeFragment, mUserStreamFragment);
break;
case VersyConstants.HOLDER_TYPE_2:
holder = ViewHolder_Var2.create(parent, mUserHomeFragment, mUserStreamFragment);
break;
case VersyConstants.HOLDER_TYPE_3:
holder = ViewHolder_Var3.create(parent, mUserHomeFragment, mUserStreamFragment);
L.i(getClass().getSimpleName(), "HOLDER 3");
break;
case VersyConstants.HOLDER_TYPE_4:
holder = ViewHolder_Var4.create(parent, mUserHomeFragment, mUserStreamFragment);
L.i(getClass().getSimpleName(), "HOLDER 4");
break;
case VersyConstants.HOLDER_TYPE_5:
holder = ViewHolder_Var5.create(parent, mUserHomeFragment, mUserStreamFragment);
L.i(getClass().getSimpleName(), "HOLDER 5");
break;
case VersyConstants.HOLDER_TYPE_6:
holder = ViewHolder_Var6.create(parent, mUserHomeFragment, mUserStreamFragment);
L.i(getClass().getSimpleName(), "HOLDER 6");
break;
case VersyConstants.HOLDER_TYPE_7:
holder = ViewHolder_Var7.create(parent, mUserHomeFragment, mUserStreamFragment);
L.i(getClass().getSimpleName(), "HOLDER 7");
break;
case VersyConstants.HOLDER_TYPE_8:
holder = ViewHolder_Var8.create(parent, mUserHomeFragment, mUserStreamFragment);
L.i(getClass().getSimpleName(), "HOLDER 8");
break;
case VersyConstants.HOLDER_TYPE_9:
holder = ViewHolder_Var9.create(parent, mUserHomeFragment, mUserStreamFragment);
break;
case VersyConstants.HOLDER_TYPE_10:
holder = ViewHolder_Var10.create(parent, mThumbnailViewToLoaderMap, mUserHomeFragment, mUserStreamFragment);
}
return holder;
}
问题是当我向下滚动回收站视图时遇到问题,例如,当我向上滚动到第 1 项和第 5 项时,会为第 1 项和第 5 项创建视图持有者 3。 1,它从第5个项目中回收了视图持有者,我知道这是回收者视图的想法。
如果相关数据以 JSON 格式出现,我将在视图中隐藏/显示文本视图。如果存在,我将显示哈希标签,因此在下面的第一项中:
然后,当我向上滚动到第一项时,添加了不应该添加的标签,因为没有与该对象关联的标签数据(见下文):
我已经调试并且对象数据没有混淆,没有通过代码添加标签,这取决于recyclerview回收,这两个项目具有相同的视图持有者(视图持有者3)。有没有办法防止这种情况发生?
以下是填充标签的方法。根据列表大小,我将文本视图的可见性设置为可见并填充:
protected void populateTags(List<String>tags, TextView[] array){
for(int i=0;i<tags.size(); i++){
array[i].setText(tags.get(i));
array[i].setVisibility(View.VISIBLE);
}
}
我这样称呼上面的List<String> tagsList = feedContent.getTags(); if(tagsList.size>0)populateTags(tagsList, tagsArray);
这不仅仅发生在第 1 项和第 5 项中,它取决于哪些视图被重用。如果有视图重用已显示标签的视图,则添加重用视图中的标签。非常糟糕
【问题讨论】:
标签: android android-viewholder android-recyclerview