ExpandableListView - Как установить разделитель только между родительскими элементами - PullRequest
19 голосов
/ 14 июля 2011

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

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

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

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

Ответы [ 8 ]

25 голосов
/ 28 ноября 2013

Чтобы удалить разделители только из дочерних представлений, а не между родителями в расширяемом списке:

добавьте android:childDivider="#00000000" в атрибуты ExapandableListView в XML:

<ExpandableListView
    android:id="@+id/elv"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:childDivider="#00000000" />

См. эту страницу для получения дополнительной информации

5 голосов
/ 29 декабря 2015

Задайте цвет разделителя и его высоту (разделители будут видны, когда группы свернуты)

<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" />
4 голосов
/ 08 октября 2011

Хитрость заключается в том, чтобы создать дополнительные 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>

И примените ту же технику к дочернему виду, для последнего дочернего вида вставьте дополнительный вид

1 голос
/ 05 мая 2016

Если вы хотите удалить только дочерний разделитель, можно сделать один простой трюк: вы можете создать рисование того же цвета, что и цвет фона вашего дочернего элемента. Затем установите его как дочерний разделитель.

ShapeDrawable sd1 = new ShapeDrawable(new RectShape());
    sd1.getPaint().setColor(YOUR CHILD ITEM BACKGROUND COLOR);
    mExpListView.setChildDivider(sd1);

Или используя xml:

android:childDivider="@color/child_bg_color"
1 голос
/ 19 февраля 2015
expListView.setDividerHeight(10);
expListView.setChildDivider(getResources().getDrawable(
            android.R.color.white));
1 голос
/ 30 сентября 2011

Что я сделал, так это установил делитель ExpandableListView в 0, а затем вставил группы «делителя» в его 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;
}
0 голосов
/ 07 ноября 2015

Если вы хотите иметь разделитель между родительским элементом ExpandableListView (Header) и не хотите иметь разделитель между дочерними элементами и родительским элементом, что, очевидно, является наиболее естественным случаем, тогда вы должны сделать следующее:

  1. В родительском XML-файле добавьте один вид в нижней части макета с нужной вам высотой разделителя и цветом разделителя. Пример:

  2. Сделайте то же самое в дочернем XML-файле. Добавьте один вид внизу макета с нужной вам высотой разделителя и цветом разделителя. Убедитесь, что цвет и высота разделителя такие же, как в родительском xml.

  3. В ваш метод ExpandableListView Adapter public View getGroupView (int groupPosition, логическое значение isExpanded, View convertView, ViewGroup parent) управляйте состоянием делителя View следующим образом: Пример:

    если (IsExpanded) { headerDividerView.setBackgroundColor (ContextCompat.getColor (контекст, R.color.darker_grey)); } Еще { headerDividerView.setBackgroundColor (ContextCompat.getColor (контекст, android.R.color.transparent)); }

Кстати: в моем случае R.color.darker_grey - это цвет фона родительского элемента

  1. Удалите из ExpandableListView xml все разделители и высоту разделителей. Сделайте ExpandableListView, чтобы не было разделителей и высоты разделителя. Вы можете использовать attrs следующим образом:

    андроид: groupIndicator = "@ нуль" андроид: childIndicator = "@ нуль" андроид: Делитель = «@ нуль» андроид: dividerHeight = "0dp"

0 голосов
/ 28 марта 2013

установить, как это 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" />
...