1

我有一个自定义 ExpandableListAdapter 我指定 getGroup(...) 如下:

@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {

    //do stuff
    if(something) {
        if (convertView == null) {
            LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = vi.inflate(R.layout.tasks_list_group_with_child, null);
        }

        TextView taskNameText = (TextView) convertView.findViewById(R.id.tlgwc_task_name);
        //do stuff


    } else {
        if (convertView == null) {
            LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = vi.inflate(R.layout.tasks_list_group_without_child, null);        
        }

        TextView taskNameText = (TextView) convertView.findViewById(R.id.tlgwoc_task_name);
        //do stuff

    }

    return convertView;
}

现在的问题是,当我更改在适配器中使用的数据时,getGroup(...) 方法的参数(被重用的视图对象)“convertView”可能不再具有正确的布局。如何检查它是具有 R.layout.tasks_list_group_without_child 还是 R.layout.tasks_list_group_with_child 布局的视图?

正如 API 所说“convertView:如果可能的话,要重用的旧视图。你应该在使用之前检查这个视图是非空的并且是适当的类型”,但是怎么做?!

4

3 回答 3

1

您可以将标签附加到视图

view.setTag( "TAG" );

并从 convertView 中检索它。

了解更多信息:这里

于 2012-11-27T18:40:07.237 回答
1

如果您使用 BaseExpandableListAdapter 您可以使用视图类型,因此在您的情况下,组必须:
- 覆盖 getGroupTypeCount 以返回 2 或更多(1
- 覆盖 getGroupType 以为您需要的每个不同布局返回不同的数字(2
- 然后当你调用 getGroupType 来了解视图的类型时,如果 convertView 不为空,它上面的视图将是你想要的类型的视图,因为 android 使用它来跟踪你定义的不同类型的视图并回收您需要的相同类型的视图。

于 2012-11-27T18:51:43.500 回答
0

执行此操作的“正确”方法是使用 nininho 提到的 getGroupTypeCount 技术。但是,如果您想要一种快速而肮脏的方式来执行此操作,则可以通过为 R.layout.tasks_list_group_with_child 和 R.layout.tasks_list_group_without_child 设置一个布局来实现相同的效果,但使某些元素在一种情况下消失而在另一种情况下可见。

于 2012-11-27T19:33:47.583 回答