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的组列表,并在那里把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
这可能是从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); }
- 从Android应用程序安装程序和主屏幕启动应用程序时的活动堆栈sorting问题
- Android Studio:新创build的目录不出现在文件夹视图中
- Android L中不推荐使用操作栏导航模式
- CollapsingToolbarLayout无法识别滚动条
- 如何从多选列表视图中select项目
- CollapsingToolbarLayout副标题
- 在Android中获取“对象重置的SocketException:连接”
- 无法parsingcom.android.support:appcompat-v7:22和com.android.support:recyclerview-v7:21.1.2
- 如果我在XML布局中声明一个片段,我该如何将它传递给一个Bundle?