ExpandableListView
中,有没有一种方法可以隐藏没有子项的组的组指示器?ExpandableListView
中,有没有一种方法可以隐藏没有子项的组的组指示器?尝试这个 >>>
对于所有项目
getExpandableListView().setGroupIndicator(null);
在xml中android:groupIndicator="@null"
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));
我已经测试过这个可以正常工作。根据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方法,您可以通过一条语句完成所有操作。 在适配器中,您不需要三个整数数组。您也不需要XML选择器来设置展开和折叠状态。所有这些都可以通过Java完成。
此外,这种方法还会在默认情况下正确显示组扩展时的指示器,而该博客中的代码无法实现此功能。
ViewHolder
设计模式。indicator
是视图持有者的变量名。 - Guicara如在另一篇回答中所提到的那样,由于Android将未展开的列表组视为空,即使该组有子项,图标也不会被绘制。
此链接为我解决了这个问题: http://mylifewithandroid.blogspot.com/2011/06/hiding-group-indicator-for-empty-groups.html
基本上,您需要将默认的可绘制对象设置为透明,将可绘制对象作为 ImageView 移到您的组视图中,并在适配器中切换该图片。
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);
}
}
在您的代码中,只需使用自定义 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
<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;
}
我想改进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"/>
<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
的属性 android:groupIndicator="@null"
吗?