3

我正在根据http://bartinger.at/listview-with-sectionsseparators/中描述的技术构建一个带有部分的 ListView 。但我想通过对非部分项目重用 convertView 来扩展它。但是,我发现每次输入 getView() 方法时 convertView 变量都是空的。有人可以解释为什么会这样吗?

ViewHolder holder;
final ListViewItem item = items.get(position);

if (item.isSection()) {
    Section section = (Section)item;

    convertView = inflater.inflate(R.layout.section, null);
    TextView title = (TextView) convertView.findViewById(R.id.section_title);
    title.setText(section.title);
} else {
    if (convertView == null) {
        Log.d("Adapter", "convertView was null");
    }

    Server server = (Server)item;

    convertView = inflater.inflate(R.layout.server_row, null);
    holder = new ViewHolder();
    holder.serverName = (TextView) convertView.findViewById(R.id.server_name);
    holder.serverStatusIcon = (ImageView)convertView.findViewById(R.id.server_status_icon);
    convertView.setTag(holder);

    holder.serverName.setText(server.name);
}

return convertView;

该列表正在创建和显示而没有错误,并且包含部分和非部分项目都很好。

4

3 回答 3

5

您是否正确实施

getItemViewType (int position) ?

参见 Android 的文档:

退货

表示视图类型的整数。如果可以在 getView(int, View, ViewGroup) 中将一个视图转换为另一个视图,则两个视图应该共享相同的类型。注意:整数必须在 0 到 getViewTypeCount() - 1 的范围内。也可以返回 IGNORE_ITEM_VIEW_TYPE。

所以也许convertView总是空的,因为适配器不知道哪些项目属于一起,所以它不知道哪些通过被回收......

尝试这个:

@Override
public int getItemViewType(int position) {
    if (((MyItem)getItem(position)).isHeader()) {
        return 1;
    } else {
        return 0;
    }
}

@Override
public int getViewTypeCount() {
    return 2;
}

您在 getItemViewType 中返回的索引只是将标头和非标头组合在一起的标识符。

在这种情况下,您必须在模型项中实现方法“isHeader”(或类似方法)。

于 2012-06-20T18:13:22.243 回答
0

感谢 Ixx 让我思考:我没有注意到我的清单太短了,它实际上从未填满屏幕,因此没有进行回收。

为了完整起见,我将补充一点,如果您创建多个视图类型,getView() 确实会返回 convertView - 即使您没有覆盖 getItemViewType() 和 getViewTypeCount() - 根据它们的默认实现(如下)。当然,这可能不是您想要的行为。

public int getItemViewType(int position) {
    return 0;
}

public int getViewTypeCount() {
    return 1;
}
于 2012-06-20T19:52:20.893 回答
0

我刚刚用我创建的 GridView 完成了这个。当我尝试将新膨胀的视图分配给 convertView 时遇到问题。我采用的通用结构是

public View getView(int position, @Nullable View convertView, ViewGroup parent) {

    View newView = null;
    TextView someText;

    // Test to see if there is already a view, if not create one, else use what is
    // already existant in convertView
    if (null == convertView) {
        // inflate your view type into newView here
        newView = myInflater.inflate(R.layout._________);

        // Get all of your subviews you wish to edit here from newView
        someText = (TextView)newView.findViewById(R.id._______);
    }else{
        // Get all of your subviews you wish to edit here from convertView
        someText = (TextView)convertView.findViewById(R.id._______);
    }

    // Perform all re-alignments, view layouts etc... here

    // Perform all updating of subviews data here

    // Return structure
    if (null == convertView) {
        return newView;
    } else {
        return convertView;
    }
}

希望这可以帮助!

于 2012-06-20T17:59:50.813 回答