ExpandableListView – Ocultar indicador para grupos sin hijos

¿En un ExpandableListView , hay una manera de ocultar el indicador del grupo para los grupos sin niños?

La propiedad android:groupIndicator toma un estado habilitado habilitado. Es decir, puede establecer una imagen diferente para diferentes estados.

Cuando el grupo no tiene hijos, el estado correspondiente es 'state_empty'

Vea estos enlaces de referencia:

Esto y este

Para state_empty , puedes establecer una imagen diferente que no sea confusa, o simplemente usar color transparente para no mostrar nada …

Añada este artículo en su stateful dibujable junto con otros ….

 <item android:state_empty="true" android:drawable="@android:color/transparent"/> 

Así, su statelist puede ser como esto:

 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_empty="true" android:drawable="@android:color/transparent"/> <item android:state_expanded="true" android:drawable="@drawable/my_icon_max" /> <item android:drawable="@drawable/my_icon_min" /> </selector> 

En caso de que esté utilizando una ExpandableListActivity, puede configurar el identificador de grupo en onCreate de la siguiente manera:

 getExpandableListView().setGroupIndicator(getResources().getDrawable(R.drawable.my_group_statelist)); 

He probado esto para trabajar.

Prueba esto >>>

Para todos los artículos

  getExpandableListView().setGroupIndicator(null); 

En xml

 android:groupIndicator="@null" 

Basado en la respuesta de StrayPointer y el código del blog, usted puede simplificar el código aún más:

En su xml agregue el siguiente a ExpandableListView:

 android:groupIndicator="@android:color/transparent" 

A continuación, en el adaptador, haga lo siguiente:

 @Override protected void bindGroupView(View view, Context paramContext, Cursor cursor, boolean paramBoolean){ **...** if ( getChildrenCount( groupPosition ) == 0 ) { indicator.setVisibility( View.INVISIBLE ); } else { indicator.setVisibility( View.VISIBLE ); indicator.setImageResource( isExpanded ? R.drawable.list_group_expanded : R.drawable.list_group_closed ); } } 

Mediante el uso del método setImageResource se obtiene todo con un solo forro. No necesita las tres matrices Integer en su adaptador. Tampoco necesita un selector XML para el estado expandido y contraído. Todo se hace a través de Java.

Además, este enfoque también muestra el indicador correcto cuando un grupo se amplía de forma predeterminada, lo que no funciona con el código del blog.

Como se menciona en una respuesta diferente, ya que Android trata a un grupo de listas no expandido como vacío, el icono no se dibuja aunque el grupo tenga hijos.

Este enlace resolvió el problema para mí: http://mylifewithandroid.blogspot.com/2011/06/hiding-group-indicator-for-empty-groups.html

Básicamente tiene que establecer el valor predeterminado como transparente, mover el dibujable en su vista de grupo como ImageView y alternar la imagen en su adaptador.

En su código sólo tiene que utilizar el xml personalizado para la lista de grupos y en que poner el ImageView para GroupIndicator .

Y agrega debajo de arrays en tu ExpandableListAdapter

 private static final int[] EMPTY_STATE_SET = {}; private static final int[] GROUP_EXPANDED_STATE_SET = { android.R.attr.state_expanded }; private static final int[][] GROUP_STATE_SETS = { EMPTY_STATE_SET, // 0 GROUP_EXPANDED_STATE_SET // 1 }; 

También en el método de ExpandableListAdapter agregue las mismas cosas como abajo

 public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { if (convertView == null) { LayoutInflater infalInflater = (LayoutInflater) this._context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = infalInflater.inflate(R.layout.row_group_list, null); } //Image view which you put in row_group_list.xml View ind = convertView.findViewById(R.id.iv_navigation); if (ind != null) { ImageView indicator = (ImageView) ind; if (getChildrenCount(groupPosition) == 0) { indicator.setVisibility(View.INVISIBLE); } else { indicator.setVisibility(View.VISIBLE); int stateSetIndex = (isExpanded ? 1 : 0); Drawable drawable = indicator.getDrawable(); drawable.setState(GROUP_STATE_SETS[stateSetIndex]); } } return convertView; } 

Referencia: http://mylifewithandroid.blogspot.in/2011/06/hiding-group-indicator-for-empty-groups.html

Esto podría ser otra forma de XML, set android:groupIndicator="@null"

Enlace de referencia: https://stackoverflow.com/a/5853520/2624806

Le sugiero mi solución:

1) Borrar el grupo predeterminado groupIndicator:

 <ExpandableListView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="wrap_content" android:layout_height="240dp" android:layout_gravity="start" android:background="#cccc" android:groupIndicator="@android:color/transparent" android:choiceMode="singleChoice" android:divider="@android:color/transparent" android:dividerHeight="0dp" /> 

2) en ExpandableAdapter:

 @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { if (convertView == null) { convertView = new TextView(context); } ((TextView) convertView).setText(groupItem.get(groupPosition)); ((TextView) convertView).setHeight(groupHeight); ((TextView) convertView).setTextSize(groupTextSize); //create groupIndicator using TextView drawable if (getChildrenCount(groupPosition)>0) { Drawable zzz ; if (isExpanded) { zzz = context.getResources().getDrawable(R.drawable.arrowup); } else { zzz = context.getResources().getDrawable(R.drawable.arrowdown); } zzz.setBounds(0, 0, groupHeight, groupHeight); ((TextView) convertView).setCompoundDrawables(null, null,zzz, null); } convertView.setTag(groupItem.get(groupPosition)); return convertView; } 

Utilice esto que está trabajando perfectamente para mí.

 <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/group_indicator_expanded" android:state_empty="false" android:state_expanded="true"/> <item android:drawable="@drawable/group_indicator" android:state_empty="true"/> <item android:drawable="@drawable/group_indicator"/> </selector> 

Simplemente, crea un nuevo diseño xml con height = 0 para el encabezado de grupo oculto. Por ejemplo, es 'group_list_item_empty.xml'

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="0dp"> </RelativeLayout> 

Entonces su disposición de encabezado de grupo normal es 'your_group_list_item_file.xml'

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="48dp" android:orientation="horizontal"> ...your xml layout define... </LinearLayout> 

Por último, acaba de actualizar el método getGroupView en su clase de adaptador:

 public class MyExpandableListAdapter extends BaseExpandableListAdapter{ //Your code here ... @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup viewGroup) { if (Your condition to hide the group header){ if (convertView == null || convertView instanceof LinearLayout) { LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); convertView = mInflater.inflate(R.layout.group_list_item_empty, null); } return convertView; }else{ if (convertView == null || convertView instanceof RelativeLayout) { LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); convertView = mInflater.inflate(R.layout.your_group_list_item_file, null); } //Your code here ... return convertView; } } } 

IMPORTANTE : La etiqueta raíz de los archivos de diseño (ocultos y normales) debe ser diferente (como el ejemplo anterior, LinearLayout y RelativeLayout)

¿Has intentado cambiar el atributo de ExpandableListView android:groupIndicator="@null" ?

Sólo quería mejorar la respuesta de Mihir Trivedi. Puede colocar esto dentro de getGroupView () que está dentro de la clase MyExpandableListAdapter

  View ind = convertView.findViewById(R.id.group_indicator); View ind2 = convertView.findViewById(R.id.group_indicator2); if (ind != null) { ImageView indicator = (ImageView) ind; if (getChildrenCount(groupPosition) == 0) { indicator.setVisibility(View.INVISIBLE); } else { indicator.setVisibility(View.VISIBLE); int stateSetIndex = (isExpanded ? 1 : 0); /*toggles down button to change upwards when list has expanded*/ if(stateSetIndex == 1){ ind.setVisibility(View.INVISIBLE); ind2.setVisibility(View.VISIBLE); Drawable drawable = indicator.getDrawable(); drawable.setState(GROUP_STATE_SETS[stateSetIndex]); } else if(stateSetIndex == 0){ ind.setVisibility(View.VISIBLE); ind2.setVisibility(View.INVISIBLE); Drawable drawable = indicator.getDrawable(); drawable.setState(GROUP_STATE_SETS[stateSetIndex]); } } } 

… y en cuanto a la vista de diseño, así es como mi group_items.xml parece ser

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/group_heading" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="20dp" android:paddingTop="16dp" android:paddingBottom="16dp" android:textSize="15sp" android:textStyle="bold"/> <ImageView android:id="@+id/group_indicator" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@android:drawable/arrow_down_float" android:layout_alignParentRight="true" android:paddingRight="20dp" android:paddingTop="20dp"/> <ImageView android:id="@+id/group_indicator2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@android:drawable/arrow_up_float" android:layout_alignParentRight="true" android:visibility="gone" android:paddingRight="20dp" android:paddingTop="20dp"/> 

Espero que ayude … recuerde dejar un upvote

ConvertView.setVisibility (View.GONE) debe hacer el truco.

 @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { DistanceHolder holder; if (convertView == null) { convertView = LayoutInflater.from(context).inflate(R.layout.list_search_distance_header, parent, false); if (getChildrenCount(groupPosition)==0) { convertView.setVisibility(View.GONE); } 
  • Android fastScroll sólo cubre parte de la lista
  • Android deshabilita desplazamiento automático en la vista de lista expandible
  • Los elementos secundarios ExpandableListView no obtienen el enfoque cuando se tocan
  • Agregar un botón al elemento ExpandableListView Group
  • ExpandableListView con opción múltiple guardar el elemento seleccionado en un array
  • Última fila de listview expandible no vista completa en android
  • Cómo crear dinámicamente grupos y childs en listview expandible desde json en android?
  • ExpandableListView siempre se derrumba
  • Vista de lista expandida necesaria para expandir la fila una a la vez
  • Android getChildView no se llama después de notifyDataSetChanged
  • ExpandableListView no se actualiza después de que AsyncTask finaliza la ejecución
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.