ExpandableListView - групповая индикация растягивается, чтобы соответствовать размеру текста

У меня есть индикация группы с маленьким значком, и я использую groupIndicator для вызова селектора, чтобы нарисовать его, но я вижу, что андроид по умолчанию растягивает этот значок, чтобы он соответствовал размеру текста

Как я могу предотвратить это поведение и отображать значок с его оригинальным размером?

Ответы

Ответ 1

Вы можете добавить индикатор группы с помощью метода setGroupIndicator. Но по умолчанию Android растягивает высоту индикатора, чтобы соответствовать высоте элемента группы. (ширина может быть скорректирована с помощью метода setIndicatorBounds.) Поэтому вы должны сделать высоту группового индикатора точно такой же, как высота элемента группы. (см. ExpandableListView)

В противном случае вы можете сделать полностью настроенный групповой индикатор с помощью методов onGroupCollapsed и onGroupExpanded. Просто сделайте представление с некоторыми состояниями. Когда эти методы вызывают, измените свое состояние просмотра. (см. ExpandableListAdapter)

Ответ 2

group_indicator.9.png

Независимо от того, какое изображение вы используете в качестве индикатора вашей группы, сделайте это изображение с 9 патчами (xxx.9.png) и установите его растяжимые области вокруг пикселов границы (которые, вероятно, могут быть прозрачными). Это предотвратит растяжение изображения с середины.

Ответ 3

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

Ответ 4

Я думаю, что в этом случае проще всего включить индикатор внутри вашего представления группы строк (как изображение) и изменить его выбранное состояние на основе расширения группы. Вы хотите убедиться, что ваш 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;
    }

Ответ 5

chitacan спасибо за комментарий. Очень полезно!

Но если вы пытаетесь изменить представления (например, индикатор) в groupview в методах onGroupExpanded и onGroupCollapsed, как я, вы, в конце концов, узнаете, что они вернутся в исходное состояние. Причина: exp.listview вызывает getGroupView после расширения и краха. Если вы создаете представления там и не держите их где-то, все будет генерироваться с нуля. Таким образом, вы можете просто изменить представление (индикатор) в методе getGroupView с помощью параметра isExpanded. Надеюсь, это поможет, и вы не потеряете столько времени, сколько я. В этом случае вам не понадобятся методы onGroupCollapsed и onGroupExpanded.

Ответ 6

Прежде всего, спасибо coderat. Ваш ответ мне очень помог. Недавно я понял, как можно решить не только проблему растяжения, но также и проблему, при которой drawable выравнивается по нижней/верхней части, когда groupItem больше по высоте, чем растягиваемый. Я немного поменял 9patch. Это изображение также будет работать для всех экранных плотностей (вам не нужно создавать масштабированную 9patch для каждой доступной папки (hdpi, mdpi,...)). Надеюсь, что помогает;)

enter image description here

Ответ 7

Это реализация значка индикатора с правой стороны в раскрывающемся списке. Он работает для меня.

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