2

我有一个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();
    }

    /* ... */
}
4

2 回答 2

5

总是回收行!您对getItemViewType(and getViewTypeCount) 的实现指示ListView何时回收哪些类型的视图,以免它们混淆。

您的代码片段看起来不错。所以,这一切都应该工作。唯一有点奇怪的部分是if(type == TYPE_3). 你的意思是if(type == TYPE_2)

问题是:您的代码现在有问题/异常吗?

于 2013-03-04T16:17:09.987 回答
2

如果我使用支架回收我的行,如下面的代码所示,我想我会得到一些错误,因为对于回收的行,我会得到最新的非回收行的布局,这可能不一样类型。

如果您指的是row == null支票,那么没有问题,因为它将根据方法ListView赋予您权利。convertViewgetItemViewType()

如果您再次引用MyHolder该类,这又不是问题,因为持有人被设置为行视图的标签,并且如果ListView为您提供正确的回收行视图,那么持有人标签也将在其中初始化适当的字段行的类型。而且,由于您应该MyHolder根据行类型处理,这不是问题,因为您将访问已初始化的字段。您的MyHolder类应该具有对您的三种类型的行公开的所有视图的引用,以便您可以将它们放在哪里。

所以保留回收机制。

于 2013-03-04T16:18:38.400 回答