回收具有不同行布局的ListView行

时间:2013-03-04 16:09:39

标签: android android-listview adapter

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

    /* ... */
}

2 个答案:

答案 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类应该包含三种类型行所显示的所有视图的引用,以便您可以放置​​它们。

所以保持回收机制。