ExpandableListView-隐藏没有子组的指示器


Answers:


111

试试这个>>>

对于所有项目

 getExpandableListView().setGroupIndicator(null);

在xml中

android:groupIndicator="@null"

40
我相信这将为所有项目而不只是那些没有孩子的项目设置groupIndicator。
ericosg 2013年

4
经过测试,不起作用。这个简单的隐藏所有指标要么有孩子,要么没有孩子。
frusso 2015年

2
myExpandableListView.setGroupIndicator(null); 为我工作
Ranjith Kumar

@ericosg有什么方法可以隐藏没有孩子的团体的指标吗?
KJEjava48 2016年

1
它隐藏了所有指标,而不是没有孩子的指标。
山姆

88

android:groupIndicator属性采用启用状态的drawable。也就是说,您可以为不同的状态设置不同的图像。

当组中没有子组时,相应的状态为“ state_empty”

请参阅以下参考链接:

这个这个

对于state_empty,您可以设置不引起混淆的其他图像,或者仅使用透明颜色不显示任何内容...

将此项目与其他项目一起添加到有状态可绘制对象中。

<item android:state_empty="true" android:drawable="@android:color/transparent"/>

因此,您的状态列表可以像这样:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_empty="true" android:drawable="@android:color/transparent"/>
    <item android:state_expanded="true" android:drawable="@drawable/my_icon_max" />
    <item android:drawable="@drawable/my_icon_min" />
</selector>

如果您正在使用ExpandableListActivity,则可以在onCreate中设置groupindicator,如下所示:

getExpandableListView().setGroupIndicator(getResources().getDrawable(R.drawable.my_group_statelist));

我已经测试了这是可行的。


36
不起作用:已在Android 4.0.2(ICS)中测试。请参阅此页面上对此问题的其他答复。看来Android认为未展开的组为空。只需将组指示器设置为透明,然后将imageView添加到组行中,然后在适配器的getGroupView方法中,将其设置为所需的图标即可。
Fraggle等

1
此代码对我也不起作用(已在Android 4.4上测试)。未展开的组被视为空(无子级),因此图标设置为彩色/透明。
Guicara 2014年

1
感谢您提供的代码,但看起来像是在开玩笑:如此简单的任务有这么复杂的代码吗?
Antonio Sesto

1
难以置信的是,这个答案获得了如此多的“有用”和赏金,而据记载,出于性能原因,折叠的组被认为是空的!
3c71 '18

41

根据StrayPointer的答案和博客中的代码,您可以进一步简化代码:

在您的xml中,将以下内容添加到ExpandableListView中:

android:groupIndicator="@android:color/transparent"

然后在适配器中执行以下操作:

@Override
protected void bindGroupView(View view, Context paramContext, Cursor cursor, boolean paramBoolean){
    **...**

    if ( getChildrenCount( groupPosition ) == 0 ) {
       indicator.setVisibility( View.INVISIBLE );
    } else {
       indicator.setVisibility( View.VISIBLE );
       indicator.setImageResource( isExpanded ? R.drawable.list_group_expanded : R.drawable.list_group_closed );
    }
}

通过使用setImageResource方法,您可以一口气完成所有工作。您不需要适配器中的三个Integer阵列。您也不需要XML选择器来扩展和折叠状态。所有这些都是通过Java完成的。

另外,当默认情况下扩展组时,这种方法还会显示正确的指示符,这不适用于博客中的代码。


4
这意味着可以在getGroupView()您的BaseExpandableListAdapter实现方法中使用。看一下这个示例实现
jenzz

5
@jenzz什么是“指标”?
Ibunny 2014年

他使用ViewHolder模式。indicator是视图持有者的变量名称。
Guicara 2014年

指示器是一个Imageview。您要根据状态显示的图像
Ojonugwa Jude Ochalifu 2015年

指标引用group_row xml中的explist_indicator Imageview:<?xml?> <LinearLayout android:orientation =“ horizo​​ntal” android:layout_height =“ wrap_content” android:layout_width =“ fill_parent”> <ImageView android:layout_height =“ 20px” android :layout_width =“ 20px” android:id =“ @ + id / explist_indicator” android:src =“ @ drawable / expander_group” /> <TextView android:layout_height =“ wrap_content” android:layout_width =“ fill_parent” android:id =“ @ + id / groupname“ android:paddingLeft =” 30px“ android:textStyle =” bold“ android:textSize =” 16px“ /> </ LinearLayout>
Razvan_TK9692


12

在代码中,只需将自定义xml用于组列表,然后将ImageView用于GroupIndicator

并在ExpandableListAdapter中添加以下数组

private static final int[] EMPTY_STATE_SET = {};
private static final int[] GROUP_EXPANDED_STATE_SET = { android.R.attr.state_expanded };
private static final int[][] GROUP_STATE_SETS = { EMPTY_STATE_SET, // 0
GROUP_EXPANDED_STATE_SET // 1
};

同样在ExpandableListAdapter的方法中添加如下内容

public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) 
{ 
    if (convertView == null) 
    {
        LayoutInflater infalInflater = (LayoutInflater) this._context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = infalInflater.inflate(R.layout.row_group_list, null);
    }

    //Image view which you put in row_group_list.xml
    View ind = convertView.findViewById(R.id.iv_navigation);
    if (ind != null)
    {
        ImageView indicator = (ImageView) ind;
        if (getChildrenCount(groupPosition) == 0) 
        {
            indicator.setVisibility(View.INVISIBLE);
        } 
        else 
        {
            indicator.setVisibility(View.VISIBLE);
            int stateSetIndex = (isExpanded ? 1 : 0);
            Drawable drawable = indicator.getDrawable();
            drawable.setState(GROUP_STATE_SETS[stateSetIndex]);
        }
    }

    return convertView;
}

参考: http : //mylifewithandroid.blogspot.in/2011/06/hiding-group-indicator-for-empty-groups.html


10

在XML中

android:groupIndicator="@null"

ExpandableListAdapter-> getGroupView复制以下代码

if (this.mListDataChild.get(this.mListDataHeader.get(groupPosition)).size() > 0){
      if (isExpanded) {
          arrowicon.setImageResource(R.drawable.group_up);
      } else {
          arrowicon.setImageResource(R.drawable.group_down);
      }
}

1
如何使用DEFAULT可绘制对象?它说:无法解析符号“ group-up”
StNickolay


4

建议您我的解决方案:

1)清除默认的groupIndicator:

<ExpandableListView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"       
    android:layout_width="wrap_content"
    android:layout_height="240dp"        
    android:layout_gravity="start"
    android:background="#cccc"  
    android:groupIndicator="@android:color/transparent"     
    android:choiceMode="singleChoice"
    android:divider="@android:color/transparent"        
    android:dividerHeight="0dp"  
     />

2)在ExpandableAdapter中:

@Override
public View getGroupView(int groupPosition, boolean isExpanded,
        View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = new TextView(context);
    }
    ((TextView) convertView).setText(groupItem.get(groupPosition));     
    ((TextView) convertView).setHeight(groupHeight);
    ((TextView) convertView).setTextSize(groupTextSize);

    //create groupIndicator using TextView drawable
    if (getChildrenCount(groupPosition)>0) {
        Drawable zzz ;
        if (isExpanded) {
            zzz = context.getResources().getDrawable(R.drawable.arrowup);
        } else {
            zzz = context.getResources().getDrawable(R.drawable.arrowdown);
        }                               
        zzz.setBounds(0, 0, groupHeight, groupHeight);
        ((TextView) convertView).setCompoundDrawables(null, null,zzz, null);
    }       
    convertView.setTag(groupItem.get(groupPosition));       

    return convertView;
}


2

只是想改善Mihir Trivedi的答案。您可以将其放置在MyExpandableListAdapter类的getGroupView()中

    View ind = convertView.findViewById(R.id.group_indicator);
    View ind2 = convertView.findViewById(R.id.group_indicator2);
    if (ind != null)
    {
        ImageView indicator = (ImageView) ind;
        if (getChildrenCount(groupPosition) == 0)
        {
            indicator.setVisibility(View.INVISIBLE);
        }
        else
        {
            indicator.setVisibility(View.VISIBLE);
            int stateSetIndex = (isExpanded ? 1 : 0);

            /*toggles down button to change upwards when list has expanded*/
            if(stateSetIndex == 1){
                ind.setVisibility(View.INVISIBLE);
                ind2.setVisibility(View.VISIBLE);
                Drawable drawable = indicator.getDrawable();
                drawable.setState(GROUP_STATE_SETS[stateSetIndex]);
            }
            else if(stateSetIndex == 0){
                ind.setVisibility(View.VISIBLE);
                ind2.setVisibility(View.INVISIBLE);
                Drawable drawable = indicator.getDrawable();
                drawable.setState(GROUP_STATE_SETS[stateSetIndex]);
            }
        }
    }

...关于布局视图,这就是我的group_items.xml看起来是这样的

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
    android:id="@+id/group_heading"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingLeft="20dp"
    android:paddingTop="16dp"
    android:paddingBottom="16dp"
    android:textSize="15sp"
    android:textStyle="bold"/>

<ImageView
    android:id="@+id/group_indicator"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@android:drawable/arrow_down_float"
    android:layout_alignParentRight="true"
    android:paddingRight="20dp"
    android:paddingTop="20dp"/>

<ImageView
    android:id="@+id/group_indicator2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@android:drawable/arrow_up_float"
    android:layout_alignParentRight="true"
    android:visibility="gone"
    android:paddingRight="20dp"
    android:paddingTop="20dp"/>

希望能有所帮助...记住留下赞誉


1

使用它对我来说是完美的工作。

<selector xmlns:android="http://schemas.android.com/apk/res/android">

<item android:drawable="@drawable/group_indicator_expanded" android:state_empty="false" android:state_expanded="true"/>
<item android:drawable="@drawable/group_indicator" android:state_empty="true"/>
<item android:drawable="@drawable/group_indicator"/>

</selector>

您也可以发布ExpandableListView代码吗?这对我不起作用(group_indicator出现在有和没有孩子的组中)。


0

只需为隐藏的组头创建一个高度为0的新xml布局。例如,它是“ group_list_item_empty.xml”

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"              
              android:layout_width="match_parent"
              android:layout_height="0dp">
</RelativeLayout>

然后,您正常的组标题布局为'your_group_list_item_file.xml'

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="48dp"
              android:orientation="horizontal">
    ...your xml layout define...
</LinearLayout>

最后,您只需在适配器类中更新getGroupView方法:

public class MyExpandableListAdapter extends BaseExpandableListAdapter{   

    //Your code here ...

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup viewGroup) {
        if (Your condition to hide the group header){
            if (convertView == null || convertView instanceof LinearLayout) {
                LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
                convertView = mInflater.inflate(R.layout.group_list_item_empty, null);
            }           
            return convertView;
        }else{      
            if (convertView == null || convertView instanceof RelativeLayout) {
                LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
                convertView = mInflater.inflate(R.layout.your_group_list_item_file, null);              
            }   
            //Your code here ...
            return convertView;
        }
    }
}

重要说明:布局文件的根标记(隐藏和常规)必须不同(如上例,LinearLayout和RelativeLayout)


-3

convertView.setVisibility(View.GONE)应该可以解决问题。

@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
    DistanceHolder holder;
    if (convertView == null) {
        convertView = LayoutInflater.from(context).inflate(R.layout.list_search_distance_header, parent, false);
        if (getChildrenCount(groupPosition)==0) {
            convertView.setVisibility(View.GONE);
        }

3
这只会删除所有项目:列表为空->我很伤心:(
Ich

您添加了柜台检查吗?if(getChildrenCount(groupPosition)== 0){
Vadym Vikulin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.