我有一个ListView
适配器,根据行项的类型设置不同的布局。
如果我使用持有人回收我的行,如下面的代码所示,我想我会收到一些错误,因为对于回收的行,我会得到最新的非回收行的布局,这可能不是相同类型。
在这种情况下,我应该避免回收行吗?我还有其他选择吗?
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
MyHolder holder = null;
int type = getItemViewType(position);
if(row == null)
{
holder = new MyHolder();
LayoutInflater inflater = ((Activity)mContext).getLayoutInflater();
if(type == TYPE_1){
row = inflater.inflate(R.layout.layout_type_1, parent, false);
}
else if(type == TYPE_2){
row = inflater.inflate(R.layout.layout_type_2, parent, false);
}
else {
row = inflater.inflate(R.layout.layout_type_3, parent, false);
}
row.setTag(holder);
}
else
{
holder = (MyHolder)row.getTag();
}
/* ... */
}
答案 0 :(得分:5)
始终回收行!您getItemViewType
(和getViewTypeCount
)的实施会指示ListView
何时回收哪些类型的观看次数,以免混淆。
您的代码段看起来不错。所以,一切都应该奏效。唯一有点奇怪的部分是if(type == TYPE_3)
。您的意思是if(type == TYPE_2)
吗?
问题是:您的代码中是否存在问题/异常?
答案 1 :(得分:2)
如果我使用支架回收我的行,如下面的代码所示,我 我想我会得到一些错误,因为对于一个回收的行,我会得到的 最新的非回收行的布局,可能不一样 类型。
如果您指的是row == null
检查,则没有问题,因为ListView
会根据convertView
方法为您提供正确的getItemViewType()
。
如果您指的是MyHolder
类,这又不是问题,因为持有人被设置为行视图的标记,如果ListView
为您提供了正确的回收行视图,那么holder标签还将为该类型的行初始化其中的正确字段。而且,由于您应该根据行类型处理MyHolder
,因此您不会遇到问题,因为您将访问初始化字段。您的MyHolder
类应该包含三种类型行所显示的所有视图的引用,以便您可以放置它们。
所以保持回收机制。