ExpandableListView – 组指示符伸缩以适应文本大小

我有小图标的组指示,我用groupIndicator调用select器来绘制它,但我看到默认情况下android伸展该图标,以适应文字大小

我怎样才能防止这种行为,并显示与它的原始大小的图标?

Solutions Collecting From Web of "ExpandableListView – 组指示符伸缩以适应文本大小"

您可以通过setGroupIndicator方法添加组指示符。 但是,默认情况下,Android会调整指标的高度以适应组项的高度。 (宽度可以通过setIndicatorBounds方法调整)。因此,您应该使组指示符的高度与组项目的高度完全相同。 (请参阅ExpandableListView )

否则,您可以使用onGroupCollapsedonGroupExpanded方法完全自定义组指示符。 只要看看一些状态,当这些方法被调用时,改变你的视图的状态。 (请参阅ExpandableListAdapter )

group_indicator.9.png

无论你使用什么图像作为你的组指标,使它成为9 patch(xxx.9.png)图像,并将其可伸缩区域设置为围绕边界像素(可能是透明的)。 这将防止从中间拉伸形象。

<ExpandableListView android:layout_height="fill_parent" android:layout_width="fill_parent" android:id="@+id/elv_store_info_Expandlist" android:cacheColorHint="#FFFFFF" android:overScrollMode="never" android:fastScrollEnabled="false" android:fastScrollAlwaysVisible="false" android:indicatorRight="20dp" android:divider="@android:color/transparent" android:dividerHeight="0dp" android:groupIndicator="@drawable/store_info_expandabellist_indicator" /> 

@ store_info_expandabellist_indicator.xml

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_empty="true" android:drawable="@drawable/bitmap_btn_arraw_right_dark_small"> </item> <item android:state_expanded="true" android:drawable="@drawable/bitmap_btn_arraw_bottom_white_small"> </item> <item android:drawable="@drawable/bitmap_btn_arraw_right_dark_small"> </item> </selector> 

@bitmap_btn_arraw_right_dark_small

  <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item android:left="11dp" android:right="11dp" android:top="12dp" android:bottom="12dp" android:drawable="@drawable/btn_arrowright_dark"> </item> </layer-list> 

我认为在这种情况下最简单的做法是在行组视图中包含指示器(作为imageView),并根据组是否展开来更改其选定状态。 您将需要确保您的ImageView使用select器与选定的状态drawables。

像这样的东西:

  @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { View row; if (convertView != null) { row = convertView; } else { row = LayoutInflater.from(getContext()).inflate(R.layout.group_row, null)); } final ImageView indicator = (ImageView)row.findViewById(R.id.indicator); indicator.setSelected(isExpanded); return row; } 

chitacan感谢您的评论。 很有帮助!

但是,如果你想像我一样在onGroupExpanded和onGroupCollapsed方法中改变组视图中的视图(例如指示器),你最终会发现它们会回到原来的状态。 原因:exp.listview在展开和折叠后调用getGroupView。 如果您在那里生成视图,而不是将它们保存在某个地方,则所有内容都将从头开始生成。 因此,您可以简单地使用isExpanded参数更改getGroupView方法中的视图(指示器)。 希望这会有所帮助,你不会像我一样失去那么多时间。 在这种情况下,您将不需要onGroupCollapsed和onGroupExpanded方法。

首先感谢你coderat。 你的答案帮了我很多。 我最近想到的不仅是拉伸问题可以解决的问题,而且当组件的高度大于可绘制的时候,拉伸alignment到底部/顶部的问题。 我只是改变了9patch。 此图像也适用于所有屏幕密度(您不必为每个可绘制文件夹(hdpi,mdpi,…)创build缩放9patch)。 希望有所帮助;)

在这里输入图像说明

在Expandable列表视图的右侧是指标图标的实现。 它正在为我工​​作。

 <ExpandableListView android:id="@+id/expandlv" android:layout_height="match_parent" android:layout_width="match_parent" android:dividerHeight="2dp" android:groupIndicator="@drawable/group_indicator" android:divider="@andorid:color/white"/> 

group_indicator.xml

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!--<item android:state_empty="true" android:drawable="@drawable/expanded_icon" />--> <!--<item android:state_expanded="true" android:drawable="@drawable/collapsed_icon" />--> <!--<item android:drawable="@drawable/expanded_icon"/>--> <item android:state_empty="true"> <layer-list> <item android:left="0dp" android:right="3dp" android:top="20dp" android:bottom="20dp" android:drawable="@drawable/expanded_icon"> </item> </layer-list> </item> <item android:state_expanded="true"> <layer-list> <item android:left="0dp" android:right="3dp" android:top="20dp" android:bottom="20dp" android:drawable="@drawable/collapsed_icon"> </item> </layer-list> </item> </selector> 

在java源代码中,

 DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); int width = metrics.widthPixels; expListView.setIndicatorBounds(width - GetDipsFromPixel(30), width - GetDipsFromPixel(6)); expListView.setAdapter(listAdapter);