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

时间:2011-11-21 13:46:22

标签: android expandablelistview

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

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

7 个答案:

答案 0 :(得分:25)

group_indicator.9.png

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

答案 1 :(得分:6)

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

否则,您可以使用 onGroupCollapsed onGroupExpanded 方法制作完全自定义的群组指标。只需使用某些状态创建视图,并在调用这些方法时,更改视图的状态。 (见ExpandableListAdapter

答案 2 :(得分:6)

<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>

答案 3 :(得分:4)

我认为在这种情况下最简单的做法是在行组视图中包含指示器(作为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;
    }

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

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

enter image description here

答案 6 :(得分:1)

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

<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);