繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM