ExpandableListView muestra el indicador para grupos sin hijos

Estoy creando un ExpandableListView con datos de una base de datos. Para eso, estoy usando un CursorTreeAdapter y lo CursorTreeAdapter con un objeto Cursor que contiene los datos que recupero de la base de datos.

Pensé que, por defecto, Android consideraría a los grupos sin hijos "no expandibles" .

Sin embargo, todavía muestra el icono de expansión en la fila, y cuando hago clic en él, no hace nada. No quiero que muestre este icono.

Quiero que sólo los grupos que tiene childs para mostrar el icono de expansión, que no está sucediendo. Muestra el icono de expansión para todas las filas (las que tienen hijos y sin hijos).


ACTUALIZAR

He estudiado mi código y he visto que el problema está básicamente en la configuración de groupIndicator para los grupos. Sin embargo, he intentado una gran cantidad de enfoques como la creación de un selector y su configuración es dibujable basado en el estado y ampliable, como este:

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_empty="true" android:state_expanded="false" android:drawable="@android:color/transparent"/> <item android:drawable="@drawable/expander_ic_maximized" /> </selector> 

Pero cuando el grupo está colapsado, se esconde para todos los grupos, incluidos los que tienen hijos (porque Android reconoció los grupos colapsados ​​como vacíos).

Cualquier mejor enfoque para establecer el indicador sólo para grupos con niños?


Aquí está mi código.

 public class ContactsExpandableListAdapter extends CursorTreeAdapter { TextView mContactNameTextView, mContactNumberTextView; Cursor mChildrenCursor = null; public ContactsExpandableListAdapter(Cursor cursor, Context context) { super(cursor, context); } @Override protected Cursor getChildrenCursor(Cursor cursor) { if(mContactId == -1) mContactId = null; return mController.getContactById(mContactId); } public int getChildrenCount(int groupPosition) { return mChildrenCursor.getCount(); } @Override protected View newGroupView(Context context, Cursor cursor, boolean paramBoolean, ViewGroup viewGroup) { View view = LayoutInflater.from(context).inflate(R.layout.filterbycontact, viewGroup, false); mContactNameTextView = (TextView) view.findViewById(R.id.contact_name); if(cursor.getString(cursor.getColumnIndex("contact_name")) == null) mContactNameTextView.setText(cursor.getString(cursor.getColumnIndex("contact_number"))); else mContactNameTextView.setText(cursor.getString(cursor.getColumnIndex("contact_name"))); view.setTag(cursor.getString(cursor.getColumnIndex("contact_id"))); return view; } @Override protected View newChildView(Context context, Cursor cursor, boolean paramBoolean, ViewGroup viewGroup) { View view = LayoutInflater.from(context).inflate(R.layout.filterbycontact, viewGroup, false); if(cursor.getString(cursor.getColumnIndex("contact_name")) == null) { mContactNameTextView = (TextView) view.findViewById(R.id.contact_name); mContactNameTextView.setText(cursor.getString(cursor.getColumnIndex("contact_number"))); } else { mContactNumberTextView = (TextView) view.findViewById(R.id.contact_number); mContactNumberTextView.setText(cursor.getString(cursor.getColumnIndex("contact_number"))); } view.setTag(cursor.getString(cursor.getColumnIndex("contact_number"))); return view; } @Override protected void bindGroupView(View view, Context paramContext, Cursor cursor, boolean paramBoolean) { mContactNameTextView = (TextView) view.findViewById(R.id.contact_name); if(cursor.getString(cursor.getColumnIndex("contact_name")) == null) mContactNameTextView.setText(cursor.getString(cursor.getColumnIndex("contact_number"))); else mContactNameTextView.setText(cursor.getString(cursor.getColumnIndex("contact_name"))); view.setTag(cursor.getString(cursor.getColumnIndex("contact_id"))); } @Override protected void bindChildView(View view, Context context, Cursor cursor, boolean paramBoolean) { if(cursor.getString(cursor.getColumnIndex("contact_name")) == null) { mContactNameTextView = (TextView) view.findViewById(R.id.contact_name); mContactNameTextView.setText(cursor.getString(cursor.getColumnIndex("contact_number"))); } else { mContactNumberTextView = (TextView) view.findViewById(R.id.contact_number); mContactNumberTextView.setText(cursor.getString(cursor.getColumnIndex("contact_number"))); } } } 

En su xml agregue el siguiente a ExpandableListView:

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

Cada vista de elemento de grupo en su adaptador necesita su indicador interno. Por ejemplo, puede agregar un ImageView en el lado derecho en su .xml.

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) { viewHolder.indicator.setVisibility(View.VISIBLE); viewHolder.indicator.setImageResource( isExpanded ? R.drawable.indicator_expanded : R.drawable.indicator); } else { viewHolder.indicator.setVisibility(View.GONE); } } 

En su clase de adaptador utilice:

 public View getGroupView(int groupPosition, boolean isExpanded, View convertView,ViewGroup parent) { if (getChildrenCount(groupPosition) == 0 ) { indicator.setVisibility( View.INVISIBLE ); } else { indicator.setVisibility( View.VISIBLE ); indicator.setImageResource( isExpanded ? R.drawable.group_expanded : R.drawable.group_closed ); } } 

¿Por qué no dejar a los grupos sin hijos?

Cambie la consulta para darle sólo grupos que tendrán hijos.

  • No se pudo leer la fila 1, col -1 de CursorWindow. Asegúrese de que el cursor se inicialice correctamente antes de acceder a los datos de él
  • Animar a los niños de una lista expandible cuando se colapsan / expanden
  • Establecer bordes para un elemento de grupo expandido mediante ExpandableListView
  • Enlace de datos de Android en una lista expandible
  • Onfling y OnTouch no trabajan juntos
  • ¿Cómo puedo quitar el botón de ExpandableListView?
  • Nueva lista expandible altamente personalizable
  • El divisor de Android ExpandableListView es invisible
  • Problema con Expanding Multi-Level ExpandableListView
  • Depurando ExpandableListView de la base de datos - no funciona
  • Después de mantener el estado de colapso / expansión para nivel N o Multinivel lista ampliable algunos subgrupos no se muestran
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.