[英]Recycling ListView rows with different row layouts
我有一个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();
}
/* ... */
}
始终回收行! 您对getItemViewType
(和getViewTypeCount
)的实现指示ListView
何时回收哪些类型的视图,以免混淆。
您的代码段看起来不错。 所以,一切都应该奏效。 唯一有点奇怪的部分是if(type == TYPE_3)
。 你的意思if(type == TYPE_2)
?
问题是:您的代码中是否存在问题/异常?
如果我使用支架回收我的行,如下面的代码所示,我想我会收到一些错误,因为对于一个回收的行,我会得到最新的非回收行的布局,这可能不一样类型。
如果你指的是row == null
check,那么没有问题,因为ListView
会根据getItemViewType()
方法为你提供正确的convertView
。
如果您引用的是MyHolder
类,这又不是问题,因为将holder设置为行视图的标签,并且如果ListView
为您提供了正确的回收行视图,则holder标签中还将初始化适当的字段对于那种类型的行。 而且,因为您应该根据行类型处理MyHolder
,所以这不是问题,因为您将访问初始化的字段。 MyHolder
类应该对三种类型的行公开的所有视图都具有引用,以便可以在哪里放置它们。
因此,请保持回收机制。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.