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.

  • ¿Cómo puedo replicar este patrón de interfaz de usuario: haga clic en el elemento ListView y expanda debajo de él?
  • Implementar el divisor entre el último elemento del niño y el siguiente grupo de cabecera.
  • EnhancedListView con ExpandableListView
  • Clear ExpandableListView
  • Creación de un RecyclerView ampliable
  • Mostrar sólo un hijo de la lista ampliable a la vez
  • Android: ¿Hay una manera de animar tanto el grupo como el listview de un ExpandableListView?
  • Android: cacheColorHint = "# 00000000" no funcionan para <ExpandableListView
  • Android - ListView expandible - con ViewHolder para la optimización
  • Android ExpandableListView y base de datos SQLite
  • GetChildView no se llama
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.