Подтвердить что ты не робот

ExpandableListView - как установить разделитель только между родительскими элементами

Я хочу поставить разделитель только между родительскими элементами. Когда я устанавливаю

android:divider="@drawable/divider"
android создает разделитель между родительскими элементами, но также создает разделитель между дочерними элементами. Когда я добавляю
android:childDivider="@color/transparent"
, андроид удаляет разделитель между дочерними элементами, но свободное пространство между ними остается. Зачем? Я попытался
android:dividerHeight="0dp"
, но ничего не произошло.

В общем, я хочу установить разделитель между родительскими элементами, но я не хочу делителя или пустого пространства между дочерними элементами.

любые идеи, как это сделать?

4b9b3361

Ответ 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 является цветом фона родительского

  1. Удалите из 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" />