可扩展列表中空组的备用视图

时间:2014-01-28 00:38:40

标签: android expandablelistview

问题很简单,但我无法使其发挥作用。 我有一个带有3个标题的可扩展列表,它们可以填充或为空。

我希望在展开一个空的组时显示一个简单的文本视图,我一直在寻找一段时间,但似乎没有任何工作。 我不能使用setEmpty(),因为这只有在所有组都为空时才有效。

我在这里找到了一个类似的帖子:ExpandableListView - empty group message

如果我尝试按建议的答案建议,那么:

@Override
public int getChildrenCount(int groupPosition) {
    if(this._listDataChild.get(this._listDataHeader.get(groupPosition))
            .size() != 0){
        return this._listDataChild.get(this._listDataHeader.get(groupPosition))
                .size();        
    }
    return 1;
}

当我尝试扩展空组时,我收到错误...我认为这无论如何都不会起作用,例如如果我有一个有1个孩子的小组将会发生什么,它会被认为是空的吗? ?

编辑:

好的我通过总是在mys子列表的第一个位置有一个空对象来解决这个问题,然后当getchildrencount返回1时,我知道它实际上是空的,所以我调用了交换机的空盒子。 在交换机的填充情况下,我总是隐藏第一个元素,这可能不是最干净的方法,但这可行。

2 个答案:

答案 0 :(得分:1)

如果您使用不同的布局,无论它们是填充还是空白,您都可以通过覆盖getChildTypegetGroupType来区分

private static final int CHILD_TYPE_COUNT = 2;

@Override
public int getChildType(int groupPosition, int childPosition) {
    if(obj.isEmpty())
        return 0;
    else if(obj.isPopulated)
        return 1;
}

@Override
public int getChildTypeCount() {
    return CHILD_TYPE_COUNT;
}

然后您可以使用相应的布局来填充。我建议你也使用ViewHolder-Pattern

static class PopulatedViewHolder {
    //declare the elements of a populated view here
}

static class EmptyViewHolder {
    //declare the elements of an empty view here
}


@Override
public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild,
        View convertView, ViewGroup parent) {

    EmptyViewHolder emptyViewHolder = null;
    PopulatedViewHolder populatedViewHolder = null;

    //check if the type of your view is populated or empty and use the corresponding layout
    int type = getChildType(groupPosition, childPosition);

    if (convertView == null || (type == 0 && (convertView.getTag()) instanceof PopulatedViewHolder) || (type == 1 && (convertView.getTag()) instanceof EmptyViewHolder)) {
        LayoutInflater inflater = (LayoutInflater)context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        switch(type){
            case 0:
                //type is empty
                emptyViewHolder =  new EmptyViewHolder();
                convertView = inflater.inflate(R.layout.empty_layout,
                        parent, false);

                //...initialize your viewcomponents of the populated layout here...

                convertView.setTag(emptyViewHolder);
                break;
            case 1:
                //populated
                populatedViewHolder = new PopulatedViewHolder();
                convertView = inflater.inflate(
                        R.layout.populated_layout, parent, false);

                //...initialize your viewcomponents of the populated layout here...

                convertView.setTag(populatedViewHolder);

                break;
        }
    }
    else {
        switch (type) {
            case 0:
                emptyViewHolder = (EmptyViewHolder)convertView.getTag();
                break;

            case 1:
                PopulatedViewHolder = (PopulatedViewHolder)convertView.getTag();
                break;
        }
    }

    switch(type){
        case 0:
            //empty
            //set the values of your empty view here

            break;
        case 1:
            //populated
            //set the values of your populated view here

            break;
     }

    return convertView;
}    

答案 1 :(得分:0)

如果要扩展BaseExpandableListAdapter,可以更改BaseExpandableListAdapter的getGroupView,以根据子项是否为空来返回不同位置的不同视图

public override查看GetGroupView(int groupPosition,bool isExpanded,View convertView,ViewGroup parent) { //第二个孩子的空数据和第二个孩子的视图 if(position == 1&& _childData.getCount(1)== 0) { //返回新的TextView,你可以创建一个成员变量textview,并返回它 } }