查找视图的布局类型

时间:2012-11-27 18:30:29

标签: android layout view expandablelistadapter

我有一个自定义的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布局检查其是否为View?

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

3 个答案:

答案 0 :(得分:1)

您可以将标记附加到视图

view.setTag( "TAG" );

并从convertView中检索它。

详细了解:here

答案 1 :(得分:1)

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

答案 2 :(得分:0)

“正确”的方法是使用nininho提到的getGroupTypeCount技术。如果你想要一个快速而肮脏的方法来做到这一点,可以通过为R.layout.tasks_list_group_with_child和R.layout.tasks_list_group_without_child提供单一布局来实现相同的效果,但是在一种情况下使一些元素消失而在另一种情况下可见。