android - ExpandableListView: cómo establecer divisor solo entre elementos principales
parent divider (8)
El truco es crear una view
adicional para el diseño del grupo de contracción y el diseño secundario del último.
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>
expandido_grupo.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>
Y aplique la misma técnica a la vista secundaria, para la última vista secundaria, inserte la vista adicional
Quiero poner divisor solo entre elementos padre. Cuando me puse
android:divider="@drawable/divider"
Android crea divisor entre elementos principales, pero crea divisor entre elementos secundarios también. Cuando agrego
android:childDivider="@color/transparent"
Android elimina el divisor entre elementos secundarios, pero el espacio libre entre ellos permanece. ¿Por qué? He intentado
android:dividerHeight="0dp"
Pero nada pasó.
En todo lo que quiero es establecer divisor entre los elementos principales, pero no quiero ningún separador o espacio vacío entre los elementos secundarios.
¿Alguna idea de cómo hacer eso?
Indique el color del divisor y su altura (los divisores serán visibles cuando los grupos se colapsen)
<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" />
Lo que hice fue establecer el divisor de ExpandableListView en 0 y luego insertar los grupos de "divisor" en su 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;
}
Para eliminar divisiones solo de las vistas secundarias y no entre los padres en la lista expandible:
agregue android:childDivider="#00000000"
en los atributos ExapandableListView
en XML:
<ExpandableListView
android:id="@+id/elv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:childDivider="#00000000" />
Consulte esta página para más información.
Si desea eliminar solo el divisor infantil, un truco sencillo es crear un dibujable con el mismo color que el color de fondo del elemento de su hijo. Luego configúralo como divisor infantil.
ShapeDrawable sd1 = new ShapeDrawable(new RectShape());
sd1.getPaint().setColor(YOUR CHILD ITEM BACKGROUND COLOR);
mExpListView.setChildDivider(sd1);
O utilizando xml:
android:childDivider="@color/child_bg_color"
Si desea tener un elemento divisor entre el elemento principal de ExpandableListView (Encabezado) y no desea tener un elemento divisor entre los elementos secundarios y el principal, que obviamente es el caso más natural, debe hacer lo siguiente:
En su archivo xml principal agregue una Vista en la parte inferior del diseño con la altura del divisor y el color del divisor que necesite. Ejemplo:
Haz lo mismo en el archivo xml hijo. Agregue una Vista en la parte inferior del diseño con la altura del divisor y el color del divisor que necesite. Asegúrese de que el color y la altura del divisor sean los mismos que en el xml principal.
En su método ExpandableListView Adapter public View getGroupView (int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) administre el estado del divisor View de esta forma: Ejemplo:
if (isExpanded) {headerDividerView.setBackgroundColor (ContextCompat.getColor (context, R.color.darker_grey)); } else {headerDividerView.setBackgroundColor (ContextCompat.getColor (context, android.R.color.transparent)); }
BTW: En mi caso, R.color.darker_grey es el color de fondo del padre
Elimine de su ExpandableListView xml todos los divisores y la altura de los divisores. Haga que ExpandableListView no tenga divisores ni altura de divisor. Puedes usar attrs como este:
android: groupIndicator = "@ null" android: childIndicator = "@ null" android: divider = "@ null" android: dividerHeight = "0dp"
establece como este android:divider="@null"
no divisor para padres android:divider="2dp"
divisor de set para padres
<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" />
expListView.setDividerHeight(10);
expListView.setChildDivider(getResources().getDrawable(
android.R.color.white));