ExpandableListView - как установить разделитель только между родительскими элементами
Я хочу поставить разделитель только между родительскими элементами. Когда я устанавливаю
android:divider="@drawable/divider"
android создает разделитель между родительскими элементами, но также создает разделитель между дочерними элементами. Когда я добавляю
android:childDivider="@color/transparent"
, андроид удаляет разделитель между дочерними элементами, но свободное пространство между ними остается. Зачем?
Я попытался
android:dividerHeight="0dp"
, но ничего не произошло.
В общем, я хочу установить разделитель между родительскими элементами, но я не хочу делителя или пустого пространства между дочерними элементами.
любые идеи, как это сделать?
Ответы
Ответ 1
Чтобы удалить разделители только из дочерних представлений, а не между родителями в расширяемом списке:
добавить android:childDivider="#00000000"
в атрибуты ExapandableListView
в XML:
<ExpandableListView
android:id="@+id/elv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:childDivider="#00000000" />
Для получения дополнительной информации см. эту страницу
Ответ 2
Дайте цвет делителя и его высоту (разделители будут видны, когда группы рухнут)
<ExpandableListView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="@color/color_black"
android:dividerHeight="1dp"
android:groupIndicator="@null" />
Ответ 3
Трюк заключается в создании дополнительного view
для раскладки группового макета и последнего дочернего макета.
collapse_group.xml:
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="17sp"/>
<!-- this is the extra view-->
<View
android:layout_width="fill_parent"
android:layout_height="10dp"
android:background="@android:color/transparent"/>
</LinearLayout>
expanded_group.xml:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="17sp"/>
<!-- no extra view-->
</LinearLayout>
И примените ту же технику к дочернему виду, для последнего дочернего представления добавьте дополнительный просмотр
Ответ 4
То, что я сделал, это установить разделитель ExpandableListView в 0, а затем вставить в него группы "divider" ExpandableListAdapter:
// To get dividers between the groups we add 'divider views' as if they were
// themselves groups.
public int getGroupCount() {
// Actual groups are at even groupPositions, dividers at odd
return (this.data.size() * 2) - 1;
}
public long getGroupId(int groupPosition) {
if(groupPosition % 2 != 0) return R.id.divider;
else return R.id.group;
}
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
if(groupPosition % 2 != 0) {
View divider = convertView;
if(divider == null || divider.getId() != R.id.divider) {
divider = this.inflater.inflate(R.layout.divider, null);
}
return divider;
}
View group = convertView;
if(group == null || group.getId() != R.id.group) {
group = this.inflater.inflate(R.layout.group, null);
}
return group;
}
Ответ 5
expListView.setDividerHeight(10);
expListView.setChildDivider(getResources().getDrawable(
android.R.color.white));
Ответ 6
Если вы хотите удалить только дочерний разделитель, один простой трюк. Вы можете создать выталкиваемый с тем же цветом, что и цвет фона вашего дочернего элемента. Затем установите его как дочерний разделитель.
ShapeDrawable sd1 = new ShapeDrawable(new RectShape());
sd1.getPaint().setColor(YOUR CHILD ITEM BACKGROUND COLOR);
mExpListView.setChildDivider(sd1);
Или используя xml:
android:childDivider="@color/child_bg_color"
Ответ 7
Если вы хотите иметь разделитель между родительским элементом ExpandableListView (Header) и не хотите иметь разделитель между дочерними элементами и родителем, что, очевидно, является самым естественным случаем, тогда вам нужно сделать следующее:
-
В вашем родительском XML файле добавьте один вид в нижней части макета с высотой делителя и цветом разделителя, который вам нужен.
Пример:
-
Сделайте то же самое в дочернем xml файле. Добавьте один вид в нижней части макета с высотой делителя и цветом разделителя, который вам нужен. Убедитесь, что цвет и высота разделителя такие же, как в родительском xml.
-
В свой метод ExpandableListView Adapter
public Посмотреть getGroupView (int groupPosition, boolean isExpanded, Просмотреть convertView, родительскую группу ViewGroup)
управляйте состоянием делителя вида следующим образом:
Пример:
если (IsExpanded) { headerDividerView.setBackgroundColor(ContextCompat.getColor(контекст, R.color.darker_grey)); } Еще { headerDividerView.setBackgroundColor(ContextCompat.getColor(контекст, android.R.color.transparent)); }
BTW: В моем случае R.color.darker_grey является цветом фона родительского
-
Удалите из ExpandableListView xml все разделители и разделители. Сделайте ExpandableListView не имеющим разделителей и высоту разделителя.
Вы можете использовать attrs следующим образом:
Android: groupIndicator = "@нуль"
андроид: childIndicator = "@нуль"
андроид: Делитель = "@нуль"
андроид: dividerHeight = "0dp"
Ответ 8
Я решил это, добавив два представления, одно к заголовку, а другое к дочернему элементу, как показано ниже.
Header.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RelativeLayout
android:id="@+id/rl_header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/square_box"
android:padding="@dimen/padding_10">
<ImageView
android:id="@+id/expandableIndicator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:src="@drawable/ic_downarrow" />
</RelativeLayout>
<View
android:id="@+id/view_hidden"
android:layout_width="match_parent"
android:layout_height="10dp"
android:layout_below="@+id/rl_header"
android:background="@android:color/transparent" />
</RelativeLayout>
child.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RelativeLayout
android:id="@+id/rl_childView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/square_box"
android:padding="@dimen/padding_10">
<TextView
android:id="@+id/tv_startDate"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:gravity="left"
android:paddingTop="@dimen/padding_5"
android:paddingBottom="@dimen/padding_5"
android:text="Start Date \nSep. 23, 2019"
android:textSize="@dimen/text_16" />
<ImageView
android:id="@+id/iv_arrow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:src="@drawable/right_arrow" />
</RelativeLayout>
<View
android:id="@+id/view_hidden"
android:layout_width="match_parent"
android:layout_height="10dp"
android:layout_below="@+id/rl_childView"
android:background="@android:color/transparent" />
</RelativeLayout>
Теперь добавьте этот код в свой класс Adapter. Идея состоит в том, чтобы показать/скрыть представление, когда группа развернута/свернута, показать на последнем элементе дочернего элемента.
@Override
public View getGroupView(int listPosition, boolean isExpanded, View convertView,
ViewGroup parent) {
String listTitle = (String) getGroup(listPosition);
String listCount = "(" + getChildrenCount(listPosition) + ")";
if (convertView == null) {
LayoutInflater layoutInflater = (LayoutInflater)
this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = layoutInflater.inflate(R.layout.expandable_header, null);
}
View view_hidden = convertView.findViewById(R.id.view_hidden);
if (isExpanded) {
view_hidden.setVisibility(View.GONE);
} else {
view_hidden.setVisibility(View.VISIBLE);
}
return convertView;
}
@Override
public View getChildView(int listPosition, final int expandedListPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
final Medication medication = (Medication) getChild(listPosition,
expandedListPosition);
if (convertView == null) {
LayoutInflater layoutInflater = (LayoutInflater)
this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = layoutInflater.inflate(R.layout.expandable_item, null);
}
View view_hidden = convertView.findViewById(R.id.view_hidden);
if (isLastChild) {
view_hidden.setVisibility(View.VISIBLE);
} else {
view_hidden.setVisibility(View.GONE);
}
return convertView;
}
Ответ 9
установить как этот android:divider="@null"
разделитель для родителей android:divider="2dp"
установить разделитель для родителей
<ExpandableListView
android:id="@+id/expandable_list"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:background="#ffffff"
android:divider="2dp"
android:groupIndicator="@drawable/group_indicator" />