【发布时间】:2012-01-03 00:15:13
【问题描述】:
我有带有小图标的组指示,我使用 groupIndicator 调用选择器来绘制它,但我看到 android 默认拉伸该图标以适合文本大小
如何防止这种行为,并以原始大小显示图标?
【问题讨论】:
标签: android expandablelistview
我有带有小图标的组指示,我使用 groupIndicator 调用选择器来绘制它,但我看到 android 默认拉伸该图标以适合文本大小
如何防止这种行为,并以原始大小显示图标?
【问题讨论】:
标签: android expandablelistview
无论您使用什么图像作为组指示符,都将其设为 9 块 (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>
【讨论】:
您可以通过 setGroupIndicator 方法添加组指标。但默认情况下,Android 会拉伸指示器的高度以适应组项的高度。 (宽度可以通过setIndicatorBounds方法调整。) 因此,您应该使组指示器的高度与组项的高度完全相同。 (见ExpandableListView)
否则,您可以使用 onGroupCollapsed 和 onGroupExpanded 方法制作完全自定义的组指示器。只需创建一个具有某些状态的视图,当调用这些方法时,更改视图的状态。 (见ExpandableListAdapter)
【讨论】:
我认为在这种情况下最简单的做法是将指示器包含在行组视图中(作为 imageView),并根据组是否展开来更改其选定状态。您需要确保您的 ImageView 使用具有选定状态可绘制对象的选择器。
类似这样的:
@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;
}
【讨论】:
if (isExpanded) { ivIndicator.setImageResource(R.drawable.ic_expended); } else { ivIndicator.setImageResource(R.drawable.collapsed); }
chitacan 感谢您的评论。很有帮助!
但是,如果您像我一样尝试在 onGroupExpanded 和 onGroupCollapsed 方法中更改组视图中的视图(例如指示器),您最终会发现它们会变回原来的状态。原因:exp.listview在展开折叠后调用getGroupView。如果您在那里生成视图而不是将它们保存在某个地方,那么一切都将从头开始生成。因此,您可以使用 isExpanded 参数简单地更改 getGroupView 方法中的视图(指标)。希望这会有所帮助,并且您不会像我一样浪费太多时间。在这种情况下,您将不需要 onGroupCollapsed 和 onGroupExpanded 方法。
【讨论】:
首先感谢 coderat。你的回答对我帮助很大。我最近想出了如何不仅可以解决拉伸问题,而且还可以解决当 groupItem 的高度大于可绘制对象时可绘制对象与底部/顶部对齐的问题。我只是稍微更改了 9patch。此图像也适用于所有屏幕密度(您不必为每个可绘制文件夹(hdpi、mdpi、...)创建一个缩放的 9patch)。希望有帮助;)
【讨论】:
是Expandable List View右侧指标图标的实现。 它对我有用。
<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);
【讨论】: