ExpandableListView – 组指示是拉伸以适合文本大小

我有小图标的组指示,我使用groupIndicator调用选择器来绘制它,但我看到android默认拉伸该图标以适合文本大小

我该如何防止这种行为,并显示带有原始尺寸的图标?

Related of "ExpandableListView – 组指示是拉伸以适合文本大小"

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

否则,您可以使用onGroupCollapsedonGroupExpanded方法创建完全自定义的组指示符。 只需使用某些状态创建视图,并在调用这些方法时,更改视图的状态。 (参见ExpandableListAdapter )

group_indicator.9.png

无论您使用什么图像作为组指示器,都要将其设为9补丁(xxx.9.png)图像,并将其可伸展区域设置为边框像素周围(可能是透明的)。 它将防止图像从中间拉伸。

 

@ store_info_expandabellist_indicator.xml

 < ?xml version="1.0" encoding="utf-8"?>         

@bitmap_btn_arraw_right_dark_small

  < ?xml version="1.0" encoding="utf-8"?>     

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

像这样的东西:

  @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。 你的回答对我很有帮助。 我最近想到了如何解决拉伸问题,以及当groupItem的高度大于drawable时drawable与bottom / top对齐的问题。 我刚刚更改了9patch。 此图像也适用于所有屏幕密度(您不必为每个drawable文件夹(hdpi,mdpi,…)创建缩放的9patch)。 希望有所帮助;)

在此处输入图像描述

它是可扩展列表视图中右侧指示器图标的实现。 它对我有用。

  

group_indicator.xml

 < ?xml version="1.0" encoding="utf-8"?>                  

在java源代码中,

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