ExpandableListView – 隐藏没有孩子的组的指示符

ExpandableListView ,有没有办法隐藏没有孩子的组的组指示符?

android:groupIndicator属性需要启用一个可绘制的状态。 也就是说,您可以为不同的状态设置不同的图像。

当小组没有孩子时,相应的状态是'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)); 

我已经testing过这个工作。

试试这个>>>

为所有项目

  getExpandableListView().setGroupIndicator(null); 

在xml中

 android:groupIndicator="@null" 

根据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方法,您可以完成所有工作。 你不需要你的适配器中的三个整型数组。 您也不需要用于展开和折叠状态的XMLselect器。 全部通过Java完成。

此外,这种方法还会显示正确的指标,当一个组默认展开时,哪些内容与博客中的代码无关。

正如在另一个答案中提到的那样,由于Android将未展开的列表组视为空,因此即使该组具有子项,该图标也不会绘制。

这个链接解决了我的问题: http : //mylifewithandroid.blogspot.com/2011/06/hiding-group-indicator-for-empty-groups.html

基本上你必须设置默认drawable为透明的,将drawable移动到你的组视图中作为一个ImageView并切换你的适配器中的图像。

在你的代码中,只需使用自定义xml的组列表,并在那里把ImageViewGroupIndicator

并在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

这可能是从XML的另一种方式,设置android:groupIndicator="@null"

参考链接: https : //stackoverflow.com/a/5853520/2624806

build议你我的解决scheme:

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; } 

使用它是完全为我工作。

 <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> 

简单地说,为隐藏的组页眉创build一个新的xml布局,其height = 0。 例如,它是“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> 

最后,您只需更新Adapter类中的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)

你有没有试图改变ExpandableListView的属性android:groupIndicator="@null"

只是想改进Mihir Trivedi的答案。 你可以把它放在MyExpandListList类的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"/> 

希望有帮助…记得留下一个好评

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); }