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" .
- Enlace de datos de Android en una lista expandible
- ExpandableListView getChildrenCount no se llama después de los datos cambiados, dando lugar a IndexOutOfBoundsException
- Obtener el contexto de PopupMenu como ContextMenu
- Depurando ExpandableListView de la base de datos - no funciona
- ¿Cómo conseguir pegajoso / Pinned encabezados en un ExpandableListView?
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"))); } } }
- Swipeleft para eliminar no funciona en la altura expandible listview
- Android ExpandableListView largo grupo haga clic en el oyente evitar la expansión
- Android expandablelistview no se expande ni recibe eventos de clic
- En qué condiciones se llama a getChildView () en ExpandableListAdapter
- Botón en lista desplegable android
- Cómo agregar un ExpandableListadApter en un MergeAdapter de cwac
- ¿Cómo mostrar más de 3 niveles de Vista de lista expandible?
- Android: 2 o más ExpandableListView dentro del Gaveta de navegación
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 compartir el mensaje a google plus sin el requisito de la aplicación "Google Plus" instalada en el dispositivo
- Android-AVD: error al cargar las preferencias