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